前言

        QWidget是最基本的可视化部件,它的函数繁多,本文将系统列出全部函数,和其意义,以方便查询和使用。

一、成员函数

  • 1、QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

构造一个作为父级的子级的小部件,小部件标志设置为 f。

如果 parent 为 nullptr,则新小部件将成为一个窗口。 如果 parent 是另一个小部件,则此小部件将成为 parent 内的子窗口。 删除其父级时,新小部件也将被删除。

如果将子小部件添加到已经可见的小部件,则必须明确显示子部件以使其可见。

      ~QWidget()

销毁小部件。会删除所有此小部件的子部件。如果此小部件是主小部件,则应用程序退出。

  • 2、bool close()

关闭此小部件。 返回小部件是否已关闭。

首先它向小部件发送一个 QCloseEvent。 如果小部件接受关闭事件,它就会被隐藏。 如果它忽略该事件,则什么也不会发生。 QWidget::closeEvent() 的默认实现接受关闭事件。

如果小部件具有 Qt::WA_DeleteOnClose 标志,则小部件也会被删除。无论小部件是否可见,都会向小部件传递关闭事件。

当带有 Qt::WA_QuitOnClose 属性集的最后一个可见主窗口(即没有父窗口的窗口)关闭时,会发出 QGuiApplication::lastWindowClosed() 信号。 默认情况下,为所有小部件设置此属性,但瞬态窗口除外,例如闪屏、工具窗口和弹出菜单。

      void hide()

隐藏小部件。 此函数等效于 setVisible(false)。

注意:如果正在使用 QDialog 或其子类,并且在此函数之后调用 show() 函数,则对话框将显示在其原先位置。

      void setHidden(bool hidden)

相当于setVisible(!hidden)。 

      bool isHidden()

小部件是否被隐藏。

隐藏的小部件只有在调用 show() 时才会变得可见。显示父项时不会自动显示。

      bool isVisibleTo(const QWidget *ancestor)

在显示祖先时此小部件是否也将变为可见。

如果小部件本身或任何祖先都没有被明确隐藏,则返回true。

如果小部件被屏幕上的其他窗口遮挡,则此函数仍将返回 true。

  • 3、void customContextMenuRequested(const QPoint &pos)

QWidget菜单策略

  • 4、void lower()

将小部件降低到父小部件堆栈的底部。

在此调用之后,小部件将在视觉上位于任何重叠的同级小部件之后。

      void raise()

将此小部件提升到父小部件堆栈的顶部。

在此调用之后,小部件将在视觉上位于任何重叠的同级小部件之前。

注意:使用 activateWindow() 时,可以调用该函数以确保窗口堆叠在顶部。

      void stackUnder(QWidget *w)

将小部件放在父小部件堆栈中的 w 下。小部件本身和 w 必须是同一级的。 

  • 5、void setFocus()

如果此小部件或其父级之一是活动窗口,则将键盘输入焦点赋予此小部件(或其焦点代理)。

      void clearFocus()

从小部件获取键盘输入焦点。

如果小部件具有活动焦点,则会向该小部件发送焦点移出事件,以告知它已失去焦点。

小部件必须启用焦点设置才能获得键盘输入焦点,即它必须调用 setFocusPolicy()。

  • 6、void show()

显示小部件及其子小部件。

这等效于调用 showFullScreen()、showMaximized() 或 setVisible(true),具体取决于平台对窗口标志的默认行为。

        void showFullScreen()

以全屏模式显示小部件。这个函数只在windows系统有影响。

在 macOS 上,全屏显示窗口会将整个应用程序置于全屏模式,为其提供专用桌面。在应用程序以全屏模式运行时显示另一个窗口可能会自动使该窗口也全屏显示。为了防止这种情况,在显示另一个窗口之前,在全屏窗口上调用 showNormal() 或 close() 来退出全屏模式。

      void showMaximized()

显示最大化的小部件。这个函数只在windows系统有影响。

      void showMinimized()

将最小化的小部件显示为图标。这个函数只在windows系统有影响。

      void showNormal()

在最大化或最小化后恢复小部件。这个函数只在windows系统有影响。

  • 7、void updateMicroFocus(Qt::InputMethodQuery query = Qt::ImQueryAll)

更新小部件的微焦点并通知输入法查询指定的状态已更改。

  • 8、QList<QAction *> actions()

返回此小部件操作的(可能为空)列表。

      void addAction(QAction *action)

      void addActions(const QList<QAction *> &actions)

将action附加(append)到此小部件的动作列表中。

所有 QWidget 都有一个 QAction 列表,但是它们可以用许多不同的方式以图形方式表示。 QAction 列表(由actions() 返回)的默认用途是创建上下文 QMenu。

action的所有权不会转移到这个 QWidget。

      void insertAction(QAction *before, QAction *action)

      void insertActions(QAction *before, const QList<QAction *> &actions)

在before之前,将 action 插入到此小部件的动作列表中。如果 before 为 nullptr 或 before 不是此小部件的有效 QAction,它会附加(append)该操作。

      void removeAction(QAction *action)

从此小部件的动作列表中删除action。

  • 9、void activateWindow()

将包含此小部件的顶级小部件设置为活动窗口。

活动窗口是具有键盘输入焦点的可见顶级窗口。

  • 10、void adjustSize()

调整小部件的大小以适合其内容。

如果有效,则此函数使用 sizeHint(),即尺寸提示的宽度和高度 >= 0。否则,它将大小设置为覆盖所有子部件的子矩形(即所有子部件矩形的联合)。

  • 11、QPalette::ColorRole backgroundRole()

返回小部件的背景角色。背景角色定义了用于渲染背景的小部件调色板中的画笔。

如果没有设置明确的背景角色,小部件继承其父小部件的背景角色。

      void setBackgroundRole(QPalette::ColorRole role)

设置小部件的背景角色。如果角色是 QPalette::NoRole,则小部件继承其父级的背景角色。

      QPalette::ColorRole foregroundRole()  

返回小部件的前景角色。前景角色定义了用于绘制前景的小部件调色板的颜色。

如果未设置明确的前景角色,则该函数返回一个与背景角色形成对比的角色。

      void setForegroundRole(QPalette::ColorRole role)

将小部件的前台角色设置为角色。前景角色定义了用于绘制前景的小部件调色板的颜色。

如果角色是 QPalette::NoRole,则小部件使用与后台角色形成对比的前台角色。

  • 12、QWidget * childAt(int x, int y) 

        QWidget * childAt(const QPoint &p)

返回小部件坐标系中位置 (x, y) 处的可见子小部件。

  • 13、void setMask(const QBitmap &bitmap)

仅使位图具有相应 1 位的小部件的像素可见。

如果该区域包含小部件的 rect() 之外的像素,则该区域中的窗口系统控件可能可见,也可能不可见,具体取决于平台。

请注意,如果图片内容特别复杂,这种效果可能会很慢。

掩码部件仅在其可见部分接收鼠标事件。

以下代码显示了如何使用带有 Alpha 通道的图像为小部件生成掩码:

    QLabel topLevelLabel;
    QPixmap pixmap(":/images/tux.png");
    topLevelLabel.setPixmap(pixmap);
    topLevelLabel.setMask(pixmap.mask());
      void setMask(const QRegion ®ion)

仅使重叠区域的小部件部分可见。

如果该区域包含小部件的 rect() 之外的像素,则该区域中的窗口系统控件可能可见,也可能不可见,具体取决于平台。

请注意,如果区域特别复杂,这种效果可能会很慢。

      QRegion mask()

返回当前在小部件上设置的掩码。 如果未设置掩码,则返回值将是一个空区域。

      void clearMask()

删除由 setMask() 设置的任何掩码。

  • 14、QMargins contentsMargins()

返回小部件的内容边距。

      QRect contentsRect()

返回小部件边距内的区域。

      void setContentsMargins(int left, int top, int right, int bottom)

      void setContentsMargins(const QMargins &margins)

设置小部件内容周围的边距,使其具有左、上、右和下尺寸。边距由布局系统使用,并且可以由子类使用以指定要绘制的区域(例如,不包括边框)。

更改边距将触发 resizeEvent()。

  • 15、【static】QWidget * createWindowContainer(QWindow *window, QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())

创建一个 QWidget 对象W,可以将 window 嵌入到 QWidget 的应用程序中。

W被创建为 parent 的子级并带有窗口标志标志。

W接管window的所有权。可以通过调用 QWindow::setParent() 从窗口中删除window。

  • 16、void destroy(bool destroyWindow = true, bool destroySubWindows = true)

释放窗口系统资源。 如果 destroyWindow 为true,则销毁小部件窗口。

destroy() 为所有子小部件递归调用自身。为了更好地控制子部件的销毁,首先有选择地销毁子部件。

此函数通常从 QWidget 析构函数中调用。

  • 17、WId  effectiveWinId() 

返回小部件的有效窗口系统标识符,即父级的窗口系统标识符。

如果小部件是窗口,则此函数返回原生小部件 ID。否则,返回包含该小部件的顶级小部件。

建议不要存储此值,因为它可能会在运行时更改。

  • 18、void ensurePolished()

确保小部件及其子部件已由 QStyle 润色(即,具有适当的字体和调色板)。

QWidget 在它完全构造之后第一次显示之前调用这个函数。如果想确保在执行操作之前对小部件进行优化,可以调用此函数,例如,在小部件的 sizeHint() 重新实现中可能需要正确的字体大小。 请注意,此函数是从 sizeHint() 的默认实现调用的。

如果需要在润色小部件时更改某些设置,请重新实现 event() 并处理 QEvent::Polish 类型。

  • 19、【static】QWidget * find(WId id)

返回带有窗口标识符/句柄 ID 的小部件的指针。

  • 20、WId winId()

返回小部件的窗口系统标识符。

此值可能会在运行时更改。 在窗口系统标识符发生更改后,将向小部件发送类型为 QEvent::WinIdChange 的事件。

  • 21、bool focusNextChild()

查找一个新的小部件以将键盘焦点置于适合 Tab 的位置,如果可以找到新的小部件则返回 true,否则返回 false。

      bool focusPreviousChild()

查找一个新的小部件以将键盘焦点置于适合 Shift+Tab 的位置,如果可以找到新的小部件,则返回 true,如果不能,则返回 false。 

        bool focusNextPrevChild(bool next)

根据 Tab 和 Shift+Tab 的需要,查找一个新的小部件以将键盘焦点置于其上,如果可以找到新的小部件,则返回 true,如果不能,则返回 false。

如果 next 为true,此函数向前搜索,如果 next 为false,则向后搜索。

子小部件在其父小部件上调用 focusNextPrevChild(),但只有包含子小部件的窗口决定将焦点重定向到何处。 通过为对象重新实现此函数,可以控制所有子小部件的焦点遍历。

      QWidget *nextInFocusChain()

返回当前小部件焦点链中的下一个小部件。

      QWidget * previousInFocusChain()

返回此小部件焦点链中的前一个小部件。

      QWidget * focusProxy()

返回焦点代理。

      void setFocusProxy(QWidget *w)

设置小部件的焦点代理。 如果 w 为 nullptr,则该函数将此小部件重置为没有焦点代理。

一些小部件可以“拥有焦点”,但创建一个子小部件,例如 QLineEdit,来实际处理焦点。在这种情况下,小部件可以将 QLineEdit 设置为它的焦点代理。

      【static】void setTabOrder(QWidget *first, QWidget *second)

按焦点顺序将第二个小部件放在第一个小部件之后。

它有效地从其焦点链中删除了第二个小部件,并将其插入到第一个小部件之后。

请注意,由于第二个小部件的 Tab 键顺序已更改,应该设置这样的焦点链:

setTabOrder(a, b); // a to b
setTabOrder(b, c); // a to b to c
setTabOrder(c, d); // a to b to c to d
而不是这样的:

// WRONG
setTabOrder(c, d); // c to d
setTabOrder(a, b); // a to b AND c to d
setTabOrder(b, c); // a to b to c, but not c to d
如果第一个或第二个具有焦点代理,则 setTabOrder() 会正确替换该代理。

      QWidget * focusWidget()

返回已调用 setFocus() 的此小部件的最后一个子项。对于顶级小部件,这是在此窗口被激活时将获得焦点的小部件

这与 QApplication::focusWidget() 不同,后者返回当前活动窗口中的焦点小部件。

      void grabKeyboard()

抓取键盘输入。此小部件接收所有键盘事件,直到调用 releaseKeyboard(); 其他小部件根本没有键盘事件。鼠标事件不受影响。

焦点小部件不受影响,只是它不接收任何键盘事件。setFocus() 像往常一样移动焦点,但新的焦点小部件只有在调用 releaseKeyboard() 后才会接收键盘事件。

如果其他的小部件当前正在抓取键盘输入,则首先释放该小部件的抓取。

      void releaseKeyboard()

释放键盘抓取。 

      【static】QWidget * keyboardGrabber()

返回当前正在抓取键盘输入的小部件。

      void grabMouse()

抓取鼠标输入。此小部件接收所有鼠标事件,直到调用 releaseMouse(); 其他小部件根本没有鼠标事件。键盘事件不受影响。

注意:只有可见的小部件可以抓取鼠标输入。

      void grabMouse(const QCursor &cursor)

抓取鼠标输入并更改光标形状。 

      void releaseMouse()

释放鼠标抓取。

      【static】QWidget * mouseGrabber()

返回当前正在抓取鼠标输入的小部件。

  • 22、QFontInfo fontInfo()

返回小部件当前字体的字体信息。相当于 QFontInfo(widget->font())。

  • 23、QFontMetrics fontMetrics()

返回小部件当前字体的字体规格。 相当于 QFontMetrics(widget->font())。 

  • 24、【invokable】QPixmap grab(const QRect &rectangle = QRect(QPoint(0, 0), QSize(-1, -1)))

将小部件呈现为受给定矩形限制的像素图。 如果小部件有任何子部件,那么它们也会被绘制在适当的位置。

如果指定了一个无效大小的矩形(默认),则整个小部件都会被绘制。

这个函数可以通过元对象系统和 QML 调用。

  • 25、int grabShortcut(const QKeySequence &key, Qt::ShortcutContext context = Qt::WindowShortcut)

向 Qt 的快捷系统添加一个快捷方式,该系统在给定的上下文中监视给定的键序列。

Qt::WidgetShortcut:当父小部件获得焦点时快捷方式处于活动状态。
Qt::WidgetWithChildrenShortcut:当父小部件或其任何子部件具有焦点时,快捷方式处于活动状态。作为顶级小部件的子级(弹出窗口除外)不受此快捷方式上下文的影响。
Qt::WindowShortcut:当其父窗口小部件是活动顶级窗口的逻辑子窗口小部件时,快捷方式处于活动状态。
Qt::ApplicationShortcut:快捷方式适用于整个应用程序。
如果相同的按键序列被多个小部件抓取,当按键序列发生时,一个 QEvent::Shortcut 事件会以不确定的顺序发送到所有应用它的小部件。

警告:通常不需要使用此功能;而是使用需要的快捷键序列创建 QAction(如果您还需要等效的菜单选项和工具栏按钮),或者如果只需要按键序列,则创建 QShortcut 对象。 QAction 和 QShortcut 都比这个低级函数更容易使用。

      void releaseShortcut(int id)

从 Qt 的快捷方式系统中删除具有给定 id 的快捷方式。

警告:通常不需要使用此功能,因为 Qt 的快捷方式系统会在其父小部件被销毁时自动删除快捷方式。最好使用 QAction 或 QShortcut 来处理快捷方式,因为它们比这个低级函数更容易使用。

      void setShortcutAutoRepeat(int id, bool enable = true)

如果 enable 为 true,则启用具有给定 id 的快捷方式的自动重复; 否则它被禁用。

      void setShortcutEnabled(int id, bool enable = true)

如果 enable 为 true,则启用具有给定 id 的快捷方式;否则快捷方式将被禁用。

警告:通常不需要使用此功能,因为 Qt 的快捷方式系统会在其父小部件被销毁时自动删除快捷方式。最好使用 QAction 或 QShortcut 来处理快捷方式,因为它们比这个低级函数更容易使用。

  • 26、QGraphicsEffect * graphicsEffect()

返回一个指向小部件图形效果的指针。

      void setGraphicsEffect(QGraphicsEffect *effect)

设置小部件的图形效果。

如果这个widget上已经安装了一个效果,QWidget会在安装新效果之前删除现有的效果。

如果 effect 是在其他小部件上安装的效果,将从小部件中删除效果并将其安装在此小部件上。

QWidget 拥有效果的所有权。

注意:此函数将对自身及其所有子项应用效果。

注意:基于 OpenGL 的小部件不支持图形效果,例如 QGLWidget、QOpenGLWidget 和 QQuickWidget。

  • 27、QGraphicsProxyWidget * graphicsProxyWidget()

在图形视图中返回相应嵌入小部件的代理小部件。

  • 28、bool hasEditFocus()

此小部件当前是否具有编辑焦点。此功能仅在嵌入式 Linux  Qt 中可用。

  • 29、bool hasHeightForWidth()

小部件的首选高度是否取决于其宽度。

      int heightForWidth(int w)

给定宽度 w,返回此小部件的首选高度。

如果此小部件具有布局,则默认实现将返回布局的首选高度。 如果没有布局,默认实现返回 -1 表示首选高度不依赖于宽度。

  • 30、void initPainter(QPainter *painter)

使用小部件的画笔、背景和字体初始化 painter。当在 QWidget 上打开 QPainter 时会自动调用此函数。

  • 31、QVariant inputMethodQuery(Qt::InputMethodQuery query)

此方法仅与输入小部件相关。输入法使用它来查询小部件的一组属性,以便能够支持复杂的输入法操作。query 指定要查询的属性。

Qt::ImEnabled:小部件接受输入法输入。
Qt::ImCursorRectangle:在控件坐标中覆盖输入光标区域的矩形。
Qt::ImFont:当前用于文本输入的字体。
Qt::ImCursorPosition:光标在输入区域周围文本中的逻辑位置(参见 ImSurroundingText)。该位置不包含光标在预编辑区域内的偏移,由 QInputMethodEvent::Cursor 控制。
Qt::ImSurroundingText:输入区域周围的纯文本,例如当前段落。
Qt::ImCurrentSelection:当前选中的文本。
Qt::ImMaximumTextLength:小部件可以容纳的最大字符数。如果没有限制,则返回 QVariant::QVariant()。
Qt::ImAnchorPosition:选择锚的位置。这可能小于或大于 ImCursorPosition,具体取决于光标所在的选择一侧。如果没有选择,则返回与 ImCursorPosition 相同的值。
Qt::ImHints:预期输入的输入法提示。
Qt::ImPreferredLanguage:首选输入语言。
Qt::ImPlatformData:输入法的平台特定数据。
Qt::ImAbsolutePosition:光标在整个文档中的逻辑位置。该位置不包含光标在预编辑区域内的偏移,由 QInputMethodEvent::Cursor 控制。
Qt::ImTextBeforeCursor:光标前的纯文本。小部件可以决定返回多少文本,但不得返回空字符串,除非光标位于文档的开头。
Qt::ImTextAfterCursor:光标后的纯文本。小部件可以决定返回多少文本,但不得返回空字符串,除非光标位于文档末尾。
Qt::ImEnterKeyType:Enter 键类型。
Qt::ImAnchorRectangle:选择锚点的边界矩形。
Qt::ImInputItemClipRectangle:实际暴露的输入项矩形。部分输入项可能会被剪裁。该值将考虑裁剪并返回实际绘制的项目矩形。矩形位于小部件坐标中。
Qt::ImReadOnly:小部件是只读的。
Qt::ImQueryInput:通常更改输入的属性。
Qt::ImQueryAll:查询所有输入法属性。

  • 32、bool isAncestorOf(const QWidget *child) const

当前小部件是否 child 的父级(或祖父级等任何级别),且两个小部件位于同一窗口内。

  • 33、bool isEnabledTo(const QWidget *ancestor) const

当启用父级(或祖父级等任何级别)时,此小部件是否也将启用。

如果小部件本身和任何祖先都没有被明确禁用,就会返回true。

这里的祖先是指同一窗口内的父小部件。

  • 34、bool isWindow()

小部件是否独立窗口。

窗口是一个在视觉上不是任何其他小部件的子部件的小部件,它通常有一个框架和一个窗口标题。

一个窗口可以有一个父小部件。然后,它将与其父对象分组,并在删除父对象时将其删除,在最小化父对象时将其最小化等。如果窗口管理器支持,它还将具有与其父对象相同的任务栏条目。

即使在构造函数中指定了父小部件,QDialog 和 QMainWindow 小部件默认也是窗口。此行为由 Qt::Window 标志指定。

      QWidget *window()

返回此小部件的窗口,即具有(或可能具有)窗口系统框架的祖先小部件。

如果小部件是窗口,则返回小部件本身。

典型用法是通过它更改窗口标题:

aWidget->window()->setWindowTitle("New Window Title");
      QWindow * windowHandle()

如果这是原生小部件,则返回关联的 QWindow。 否则返回空值。

本机小部件包括顶级小部件、QGLWidget 和调用 winId() 的子小部件。

  • 35、QLayout * layout()

返回安装在此小部件上的布局管理器。

布局管理器负责设置已添加到布局中的小部件子代的几何形状。

      void setLayout(QLayout *layout)

设置小部件的布局管理器。QWidget 将拥有布局的所有权。

如果这个小部件上已经安装了布局管理器,QWidget 将不会允许安装另一个。必须先删除现有的布局管理器(由 layout() 返回),然后才能使用新布局调用 setLayout()。

如果layout是其他小部件上的布局管理器,则 setLayout() 将重新设置布局的父级并使其成为当前小部件的布局管理器。

调用此函数的另一种方法是将此小部件传递给布局的构造函数。

  • 36、QWidget *nativeParentWidget() 

返回此小部件的原生父级,即具有系统标识符的下一个祖先小部件。

任何桌面,Windows、GNOME、KDE、MacOS,都有着自己独特的风格。这种风格就称为 native(原生)。

  • 37、QWidget *parentWidget() 

返回小部件的父级。

  • 38、void render(QPaintDevice *target, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren))

使用 renderFlags 将小部件的 sourceRegion 区域渲染到target中。渲染从 target 中的 targetOffset 开始。

如果 sourceRegion 是一个空区域,将使用 QWidget::rect() 作为区域,即整个小部件。

注意:要获取 QOpenGLWidget 的内容,请改用 QOpenGLWidget::grabFramebuffer()。

QPixmap pixmap(widget->size());
widget->render(&pixmap);
确保在渲染之前为目标设备的活动画家(如果有)调用 QPainter::end()。 例如:

QPainter painter(this);
...
painter.end();
myWidget->render(this);
      void render(QPainter *painter, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren)) 

将小部件渲染到 painter 的 QPainter::device() 中。渲染时将使用 painter 的变换和设置。 

  • 39、void repaint()

通过立即调用paintEvent() 直接重新绘制小部件,(除非禁用更新或隐藏小部件)。

建议仅在需要立即重绘时使用 repaint()。在几乎所有情况下 update() 都更好,因为它允许 Qt 优化速度并最小化闪烁。

警告:如果在一个函数中调用 repaint(),而该函数本身可以从paintEvent() 调用,可能会得到无限递归。 update() 函数永远不会导致递归。

      void update()

除非禁用更新或隐藏小部件,否则更新小部件。

此函数不会立即导致重绘,它会在 Qt 返回到主事件循环时安排绘制事件进行处理。 与调用 repaint() 相比,这允许 Qt 优化以获得更高的速度和更少的闪烁。

多次调用 update() 通常只会导致一次 paintEvent() 调用。

Qt 通常会在调用paintEvent() 之前擦除小部件的区域。 如果设置了 Qt::WA_OpaquePaintEvent 小部件属性,则小部件将用不透明颜色绘制其所有像素。

 

void repaint(int x, int y, int w, int h)
       void repaint(const QRect &rect)
       void repaint(const QRegion &rgn)

重绘指定区域。

   

void update(int x, int y, int w, int h)
       void update(const QRect &rect)
       void update(const QRegion &rgn)

重新绘制指定区域。

       QRegion visibleRegion()

返回可能发生绘制事件的未遮挡区域。

对于可见小部件,这是其他小部件未覆盖的区域的近似值;否则,这是一个空区域。

repaint() 函数会在必要时调用此函数,因此通常不需要调用它。 

  • 40、QByteArray saveGeometry() 

保存顶级小部件的当前几何形状和状态。

要在窗口关闭时保存几何图形,可以实现如下关闭事件:

void MyWidget::closeEvent(QCloseEvent *event)
 {
     QSettings settings("MyCompany", "MyApp");
     settings.setValue("geometry", saveGeometry());
     QWidget::closeEvent(event);
 }


使用 QMainWindow::saveState() 保存窗口的几何形状以及工具栏和停靠小部件的状态。

        bool restoreGeometry(const QByteArray &geometry)

恢复存储在字节数组几何中的顶级小部件的几何形状和状态。返回结果。

如果恢复的几何图形在屏幕外,它将被修改为在可用的屏幕几何图形内。

要恢复使用 QSettings 保存的几何图形,可以使用如下代码:

QSettings settings("MyCompany", "MyApp");
myWidget->restoreGeometry(settings.value("myWidget/geometry").toByteArray());
使用 QMainWindow::restoreState() 来恢复几何图形以及工具栏和停靠窗口小部件的状态。

  • 41、void setScreen(QScreen *screen)

设置小部件应在哪个屏幕上显示。

设置屏幕只对窗口有意义。如有必要,小部件的窗口将在屏幕上重新创建。

      QScreen *screen()

返回小部件所在的屏幕。

  • 42、void setAttribute(Qt::WidgetAttribute attribute, bool on = true)

如果 on 为 true,则设置此小部件的 attribute 属性;否则清除该属性。

实用的属性(Qt::WidgetAttribute)

      bool testAttribute(Qt::WidgetAttribute attribute)

此小部件上是否设置了attribute属性。

  • 43、void setParent(QWidget *parent)

将小部件的父级设置为parent,并重置窗口标志。小部件移动到其新父级中的位置 (0, 0)。

小部件变得不可见,即使它之前是可见的。必须调用 show() 使小部件再次可见。

如果有一个动态更改其内容的小部件,则使用 QStackedWidget 会更好。

       void setParent(QWidget *parent, Qt::WindowFlags f)

此函数还接受小部件标志 f 作为参数。

  • 44、void setStyle(QStyle *style)

将小部件的 GUI 样式设置为 style。样式对象的所有权不会转移。

如果没有设置样式,小部件将使用应用程序的样式 QApplication::style() 代替。

设置小部件的样式对现有或未来的子小部件没有影响。

警告:自定义 QStyle 子类当前Qt6.2不支持样式表。

  • 45、void setWindowFlag(Qt::WindowType flag, bool on = true)

如果 on 为true,则在此小部件上设置窗口标志标志;否则清除标志。

46、void setWindowState(Qt::WindowStates windowState)

将窗口状态设置为 windowState。窗口状态是 Qt::WindowState 的 OR 组合:

Qt::WindowMinimized
Qt::WindowMaximized
Qt::WindowFullScreen
Qt::WindowActive
如果窗口不可见(即 isVisible() 返回 false),则调用 show() 时窗口状态将生效。 对于可见窗口,更改是立即的。

例如,要在全屏和普通模式之间切换,请使用以下代码:

w->setWindowState(w->windowState() ^ Qt::WindowFullScreen);
为了恢复和激活最小化的窗口(同时保留其最大化和/或全屏状态),请使用以下代码:

w->setWindowState((w->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
当窗口状态改变时,小部件会收到一个 QEvent::WindowStateChange 类型的 changeEvent()。

       Qt::WindowStates windowState() 

返回当前窗口状态。 

  • 47、void setupUi(QWidget *widget)

为指定的小部件设置用户界面。用于从使用 uic 创建的用户界面描述派生的小部件。

  • 48、bool underMouse()

小部件是否位于鼠标光标下。此值在拖放操作期间未正确更新。

  • 49、void updateGeometry()

通知布局系统此小部件已更改并且可能需要更新几何形状。

当 sizeHint() 或 sizePolicy() 更改时调用此函数。

对于隐藏的小部件,updateGeometry() 是空操作;显示的小部件则将立即通知布局系统。

  • 50、Qt::WindowType windowType() 

返回此小部件的窗口类型。

二、成员事件函数

  • 1、void actionEvent(QActionEvent *event)

当小部件的动作发生更改时(如 addAction()),会使用给定的事件调用此事件处理程序。

  • 2、void changeEvent(QEvent *event)

 Qt事件:changeEvent(改变事件)

  • 3、void closeEvent(QCloseEvent *event)

当 Qt 从窗口系统接收到对顶级小部件的窗口关闭请求时,将使用给定的事件调用此事件处理程序。

默认情况下,接受事件并关闭小部件。可以重新实现此功能以更改小部件响应窗口关闭请求的方式。 例如,可以通过对所有事件调用 ignore() 来防止窗口关闭。

void MainWindow::closeEvent(QCloseEvent *event)
 {
     if (maybeSave()) {
         writeSettings();
         event->accept();
     } else {
         event->ignore();
     }
 }
  • 4、void contextMenuEvent(QContextMenuEvent *event)

小部件上下文菜单事件。QWidget菜单策略

当小部件的 contextMenuPolicy 为 Qt::DefaultContextMenu 时,将调用处理程序。

  • 5、void dragEnterEvent(QDragEnterEvent *event)

当拖动正在进行并且鼠标进入此小部件时,将调用此事件处理程序。

如果事件被忽略,小部件将不会收到任何拖动移动事件。

       void dragLeaveEvent(QDragLeaveEvent *event)

当拖动正在进行并且鼠标离开此小部件时,将调用此事件处理程序

       void dragMoveEvent(QDragMoveEvent *event)

如果正在进行拖动,并且发生以下任何一种情况,则会调用此事件处理程序:

光标进入此小部件
光标在此小部件内移动
小部件具有焦点时按下键盘上的修饰键
       void dropEvent(QDropEvent *event)

当拖放到此小部件上时,将调用此事件处理程序。

  • 6、void enterEvent(QEnterEvent *event)

当鼠标光标进入此小部件上时,将调用此事件处理程序。

      void leaveEvent(QEvent *event)

小部件离开事件。当鼠标光标离开小部件时,会向小部件发送离开事件。

  • 7、bool event(QEvent *event)

这是主要的事件处理程序,可在子类中重新实现此函数,但建议改用专门的事件处理程序。

按键按下和释放事件的处理方式与其他事件不同。event() 检查 Tab 和 Shift+Tab 并尝试适当移动焦点。如果没有可将焦点移动到的小部件(或按键不是 Tab 或 Shift+Tab),则 event() 将调用 keyPressEvent()。

鼠标和平板电脑事件处理也有点特殊:只有在启用小部件时, event() 才会调用专门的处理程序,例如 mousePressEvent(); 否则它将丢弃该事件。

如果事件被识别,此函数返回true,否则返回false。 如果识别的事件被接受,则任何进一步的处理。

  • 8、void focusInEvent(QFocusEvent *event)

小部件的键盘焦点进入事件。

小部件通常必须将setFocusPolicy() 设置为Qt::NoFocus 以外的值才能接收此事件。

       void focusOutEvent(QFocusEvent *event)

小部件的键盘焦点失去事件。

小部件通常必须将setFocusPolicy() 设置为Qt::NoFocus 以外的值才能接收此事件。

  • 9、void hideEvent(QHideEvent *event)

小部件隐藏事件。隐藏事件在隐藏后立即发送到小部件。

注意:当窗口系统更改其映射状态时,小部件会接收自发的显示和隐藏事件,例如 当用户最小化窗口时自发隐藏事件,当窗口再次恢复时自发显示事件。

       void showEvent(QShowEvent *event)

小部件显示事件。

非自发的显示事件会在显示之前立即发送到小部件。

注意:当窗口系统更改其映射状态时,小部件会接收自发的显示和隐藏事件,例如 当用户最小化窗口时自发隐藏事件,当窗口再次恢复时自发显示事件。在接收到自发隐藏事件后,isVisible() 的值仍未true。 

  • 10、void inputMethodEvent(QInputMethodEvent *event)

输入法组合事件。当输入法的状态改变时调用这个处理程序。

在创建自定义文本编辑小部件时,必须显式设置 Qt::WA_InputMethodEnabled 窗口属性(使用 setAttribute() 函数)以便接收输入法事件。

默认实现调用 event->ignore(),即拒绝输入法事件。

  • 11、void keyPressEvent(QKeyEvent *event)

小部件的按键事件。

小部件必须首先调用 setFocusPolicy() 以接受焦点并获得焦点才能接收按键事件。

如果重新实现此处理程序,并且不对键执行操作,则调用基类实现非常重要。如果对键进行操作,则不要调用基类实现。

如果用户按下 QKeySequence::Cancel 的按键序列(通常是 Esc 键),则默认实现将关闭弹出窗口小部件。否则该事件将被忽略。

       void keyReleaseEvent(QKeyEvent *event)

小部件的按键释放事件。

小部件必须最初接受焦点并获得焦点才能接收按键释放事件。

如果重新实现此处理程序,并且不对键执行操作,则调用基类实现非常重要。如果对键进行操作,则不要调用基类实现。

  • 12、void mouseDoubleClickEvent(QMouseEvent *event)

小部件的鼠标双击事件。默认实现调用 mousePressEvent()。

       void mouseMoveEvent(QMouseEvent *event)

小部件的鼠标移动事件。

如果关闭鼠标跟踪(setMouseTracking(false)),则只有在移动鼠标时按下鼠标按钮才会发生鼠标移动事件。如果打开鼠标跟踪,即使没有按下鼠标按钮,也会发生鼠标移动事件。

QMouseEvent::pos() 报告鼠标光标的位置,相对于这个小部件。对于按下和释放事件,位置通常与上次鼠标移动事件的位置相同,但如果用户的手抖动,则位置可能不同。这是底层窗口系统的一个特性,而不是 Qt。

如果想在鼠标移动时立即显示工具提示(例如,使用 QMouseEvent::pos() 获取鼠标坐标并将它们显示为工具提示),必须首先启用鼠标跟踪,然后,为了确保工具提示立即更新,必须在 mouseMoveEvent() 的实现中调用 QToolTip::showText() 而不是 setToolTip()。

       void mousePressEvent(QMouseEvent *event)

小部件的鼠标按下事件。

如果在 mousePressEvent() 中创建新的小部件,则 mouseReleaseEvent() 可能不会在期望的位置结束,这取决于底层窗口系统、小部件的位置。

       void mouseReleaseEvent(QMouseEvent *event)

小部件的鼠标释放事件。

       void wheelEvent(QWheelEvent *event)

小部件的滚轮事件。默认实现忽略该事件。

如果重新实现此处理程序,如果不处理它,可以设置忽略事件(ignore()),以便小部件的父级可以清楚它。 

  • 13、void moveEvent(QMoveEvent *event)

小部件移动事件。当小部件收到此事件时,它已经在新位置。

旧位置可通过 QMoveEvent::oldPos() 访问。

  • 14、bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result)

处理由 eventType 标识的本地平台事件,这些事件在 message 参数中传递。

在重新实现此函数时,如果想停止 Qt 正在处理的事件,请返回 true 并设置 result。

result 参数仅在 Windows 上有意义。如果返回 false,则此原生事件将传递回 Qt,Qt 将事件转换为 Qt 事件并将其发送到小部件。

注意:只有当小部件具有本机窗口句柄时,事件才会传送到此事件处理程序。

  • 15、void paintEvent(QPaintEvent *event)

绘制事件。

绘制事件是重新绘制全部或部分小部件的请求。它可能由于以下原因之一而发生:

repaint() 或 update() 被调用
小部件之前被遮挡,现在已可见
许多小部件可以在被要求时简单地重新绘制其整个表面,但一些复杂的小部件需要通过仅绘制请求的区域来优化:QPaintEvent::region()。这种速度优化不会改变结果,因为在事件生成期间绘制区域会被裁剪到该区域。例如,QListView 和 QTableView 就是这样做的。

Qt 还尝试通过将多个绘制事件合并为一个来加速绘制。当多次调用 update() 或窗口系统发送多个绘制事件时,Qt 会将这些事件合并为一个具有更大区域的事件(QRegion::united())。repaint() 函数不允许这种优化,因此建议尽可能使用 update()。

当绘制事件发生时,更新区域通常已被擦除,因此将小部件的背景上进行绘制。

可以使用 setBackgroundRole() 和 setPalette() 设置背景。

QWidget 自动对其绘制进行双缓冲,因此无需在paintEvent()中编写双缓冲代码来避免闪烁。

通常,应该避免在paintEvent() 中调用update() 或repaint()。

  • 16、void resizeEvent(QResizeEvent *event)

小部件调整大小事件。

当 resizeEvent() 被调用时,小部件已经有了它的新尺寸。旧尺寸可通过 QResizeEvent::oldSize() 访问。

17、void tabletEvent(QTabletEvent *event)

小部件的位数板事件。默认实现忽略该事件。

如果重新实现此处理程序,如果不处理它,可以设置忽略事件(ignore()),以便小部件的父级可以清楚它。 

如果位数板跟踪关闭(setTabletTracking(false)),则位数板移动事件仅在触控笔与位数板接触或在移动触控笔时按下至少一个触控笔按钮时才会发生。如果位数板跟踪打开,即使手写笔悬停在位数板附近,没有按下任何按钮,也会发生位数板移动事件。

三、位置映射函数

  • 1、QPointF mapFrom(const QWidget *parent, const QPointF &pos)

      QPoint mapFrom(const QWidget *parent, const QPoint &pos)

将父级坐标系中的点pos转换到小部件的坐标系。

parent 不能为 nullptr,并且必须是调用小部件的父级(不一定是直接父级)。

  • 2、QPointF mapTo(const QWidget *parent, const QPointF &pos)

      QPoint mapTo(const QWidget *parent, const QPoint &pos)

将小部件坐标 pos 转换为父坐标系。(与 mapFrom() 相反)

父级不能为 nullptr,并且必须是调用小部件的父级。 

  • 3、QPointF mapFromParent(const QPointF &pos)

      QPoint mapFromParent(const QPoint &pos)

将直接父级坐标系中的点pos转换到小部件的坐标系。

如果小部件没有父级,则与 mapFromGlobal() 相同。

  • 4、QPointF mapToParent(const QPointF &pos)

      QPoint mapToParent(const QPoint &pos)

将小部件坐标 pos 转换为直接父小部件中的坐标。与 mapFromParent() 相反。

如果小部件没有父级,则与 mapToGlobal() 相同。

  • 5、QPointF mapFromGlobal(const QPointF &pos)

      QPoint mapFromGlobal(const QPoint &pos)

将全局屏幕坐标 pos 转换为小部件坐标。

  • 6、QPointF mapToGlobal(const QPointF &pos)

      QPoint mapToGlobal(const QPoint &pos)

将小部件坐标 pos 转换为全局屏幕坐标。与 mapFromGlobal() 相反。