QWidget(长文)

2023-11-03

一、描述

1、QWidget 是用户界面的原子:它从窗口系统接收鼠标、键盘和其他事件,并在屏幕上绘制自己的表示。每个小部件都是矩形的,它们按Z顺序排序。小部件由其父部件和它前面的小部件剪裁。

2、未嵌入父窗口小部件的 QWidget 称为窗口。通常,窗口有边框和标题栏。

3、QWidget 的一些没有直接使用。例如,QWidget有一个字体属性,但从不使用它。而是由其子类使用。

4、在实现一个新的小部件时,重新实现sizeHint()为小部件提供一个合理的默认大小并使用setSizePolicy()设置正确的大小策略是很有用的。大小策略为布局管理系统提供良好的默认行为。默认大小策略指示size提示表示小部件的首选大小。

5、小部件响应通常由用户操作引起的事件。Qt通过使用包含每个事件信息的QEvent子类实例调用特定的事件处理函数,将事件传递给小部件由小部件处理。

6、QWidget使用双缓冲绘制,因此不需要在paintEvent()中编写双缓冲代码来避免闪烁。

二、枚举类型成员

1、QWidget::RenderFlag:此枚举描述了在调用 QWidget::render() 时如何渲染小部件。

  • DrawWindowBackground:如果启用此选项,即使未设置 autoFillBackground,小部件的背景也会呈现到目标中。默认情况下,此选项处于启用状态。
  • DrawChildren:如果启用此选项,则小部件的子项将递归地呈现到目标中。默认情况下,此选项处于启用状态。
  • IgnoreMask:如果启用此选项,则在呈现到目标时将忽略小部件的QWidget::mask()。默认情况下,此选项处于禁用状态。

三、静态属性成员

1、acceptDrops : bool

接受拖放事件。默认为false。

2、accessibleDescription : QString

小部件的描述。描述应该提供相对详细的小部件信息。默认为一个空字符串。

3、accessibleName : QString

辅助阅读中显示的部件的名称。对于大多数小部件,不需要设置此属性。当小部件不提供任何文本时,设置此属性非常重要。默认为一个空字符串。

4、autoFillBackground : bool

是否自动填充小部件背景。默认为false。

如果启用,此属性将导致Qt在调用绘制事件之前填充小部件的背景。使用的颜色由小部件调色板中的QPalette::Window的color角色定义。此外,除非设置了WA_OpaquePaintEventWA_NoSystemBackground属性,否则窗口总是用QPalette::Window填充。如果小部件的父级具有静态渐变背景,则无法禁用此属性。

当小部件具有有效背景或边框图像的样式表时,此属性将自动禁用。

5、baseSize : QSize

小部件的基本大小。如果小部件定义了 sizeIncrement 属性,则使用基本大小计算适当的小部件大小。默认值为QSize(0,0)。

6、childrenRect : QRect

小部件子对象的边框。不包含隐藏的子对象。

默认情况下,对于没有子级的小部件,此属性包含位于原点的宽度和高度为零的矩形。

7、childrenRegion : QRegion

小部件的子项所占用的裁剪区域。不包含隐藏的子对象。

默认情况下,对于没有子级的小部件,此属性包含空区域。

8、contextMenuPolicy : Qt::ContextMenuPolicy

菜单策略(QWidget菜单策略:Qt::ContextMenuPolicy)。

9、cursor : QCursor

鼠标样式。如果没有设置鼠标,或者在调用unsetCursor()之后,将使用父级的鼠标。

默认情况下,此属性包含具有Qt::ArrowCursor样式(箭头)的鼠标。

10、enabled : bool

是否可用。默认为true。

一般来说,启用的小部件处理键盘和鼠标事件,禁用的小部件不处理(QAbstractButton例外)。有些小部件在被禁用时会以不同的方式显示。例如,按钮可能会将其标签绘制为灰色。

如果小部件需要知道它何时被启用或禁用,可以使用类型为 QEvent::EnabledChange changeEvent()。

禁用小部件会隐式禁用其所有子项,启用将启用所有子窗口小部件,除非它们已被显式禁用。当父窗口小部件保持禁用状态时,不可能显式启用不是窗口类型的子窗口小部件。

11、focus : bool

是否具有键盘输入焦点。默认为false。

12、focusPolicy : Qt::FocusPolicy

焦点策略(QWidget焦点策略:Qt::FocusPolicy)。

13、font : QFont

字体(QFont详解)。

14、frameGeometry : QRect

15、frameSize : QSize

frameGeometry()的宽高,见上图。

16、fullScreen : bool

是否全屏显示状态。

17、geometry : QRect

见上图。

18、height : int / width : int / x : int / y : int

见上图。

19、inputMethodHints : Qt::InputMethodHints

输入类型部件的输入提示。

这仅与输入小部件相关。输入法使用它来检索有关输入法应如何操作的提示。例如,如果设置了 Qt::ImhFormattedNumbersOnly 标志,则输入法可能会更改其视觉组件以反映只能输入数字。

注意:标志只是提示,因此特定的输入法实现可以随意忽略它们。如果要确保输入某种类型的字符,还应该在小部件上设置 QValidator

TextEdit

要设置标志,请执行:

w->setInputMethodHints(w->inputMethodHints()|f);

而不是:

w->setInputMethodHints(f);

22、​isActiveWindow : bool

小部件的窗口是否为活动窗口。活动窗口是包含具有键盘焦点的小部件的窗口。

21、layoutDirection : Qt::LayoutDirection

QWidget上layout()的布局方向。(Qt:布局方向

22、locale : QLocale

区域(实用QLocale)。

23、maximized : const bool / minimized : const bool

当前是否是最大化 / 最小化的。

24、maximumHeight : int

       maximumWidth : int

       maximumSize : QSize

最大高度/宽度/size(像素值),最大高/宽度默认值为16777215。

25、minimumHeight : int

       minimumWidth : int

最小高度/宽度。默认值是0。

26、minimumSize : QSize

最小size。默认是(0,0)。此属性设置的最小大小将覆盖 QLayout 定义的最小大小。

27、minimumSizeHint : QSize

给布局管理器的最小大小的提示。

  • 当QWidget没有设置布局(即 layout() == nullptr)时,返回一个无效值(QSize(-1,-1))。
  • 否则返回 layout() 的最小尺寸(与layout中的子部件以及layout的间距等设置有关)。

28、modal : bool

是否模态部件。

29、mouseTracking : bool。

是否启用鼠标跟踪。默认为false。

  • 如果禁用了鼠标跟踪,则小部件仅在移动鼠标时至少按下一个鼠标按键时接收鼠标移动事件。
  • 如果启用了鼠标跟踪,即使没有按下任何按钮,小部件也会接收鼠标移动事件。

30、normalGeometry : const QRect。

  • 当QWidget作为顶层小部件时返回 Geometry()。
  • 当作为子部件时返回空的 QRect()。

31、palette : QPalette

调色板(实用QPalette)。不能将调色板与Qt样式表一起使用。

32、pos : QPoint

小部件在其父窗口小部件内的位置。如果窗口小部件是窗口,则其位置是桌面上窗口小部件的位置(见上图)。

改变位置:

  • 小部件(如果可见)会立即接收一个移动事件(moveEvent())。
  • 如果当前不可见,则在显示之前会收到一个移动事件。

默认情况下,此属性包含一个指向原点的位置。

在 moveEvent() 中调用 move() 或 setGeometry() 可能导致无限递归。

33、rect : QRect

等于QRect(0,0,width(),height())。见上图。

34、size : QSize

等于QSize(width(),height())。

  • 如果小部件在调整大小时可见,它将立即收到一个调整大小事件(resizeEvent())。
  • 如果小部件当前不可见,则在显示之前会收到一个事件。

如果大小超出由 minimumSize() 和 maximumSize() 定义的范围,则将对其进行调整。此属性的默认值取决于用户的平台和屏幕的几何形状。

在 resizeEvent() 中调用 resize() 或 setGeometry() 可能导致无限递归。

将大小设置为QSize(0,0)将导致小部件不出现在屏幕上。

35、sizeHint : QSize

和 minimumSizeHint 相似。layout() 为空时返回无效值,否则返回 layout() 推荐的大小。

以下是不错的写法:

resize(this->sizeHint());

36、sizeIncrement : QSize

保存小部件大小的增量。

当用户调整窗口大小时,大小将在水平方向以 sizeIncrement().width() 像素和垂直方向以 sizeIncrement.height() 像素为单位移动,以 baseSize() 为基础。 首选小部件大小适用于非负整数 i 和 j:

width = baseSize().width() + i * sizeIncrement().width();
height = baseSize().height() + j * sizeIncrement().height();

虽然可以为所有小部件设置大小增量,但它仅影响窗口。

默认情况下,此属性包含宽度和高度为零的大小。

37、sizePolicy : QSizePolicy

大小策略(QSizePolicy详解)。

38、statusTip : QString

鼠标放到控件上时在窗口的状态栏显示提示信息,如果窗口无状态栏则不显示。

39、styleSheet : QString

样式表,详见:https://blog.csdn.net/kenfan1647/category_10854729.html 

40、tabletTracking : bool

是否为启用数位板跟踪。

如果禁用(默认设置)则在移动笔时,小部件仅在手写笔与数位板接触或至少按下一个手写笔按钮时接收数位板移动事件。

如果启用,则即使将鼠标悬停在附近,小部件也会接收数位板移动事件。

41、toolTip : QString

工具提示。默认情况下,仅为活动窗口的子级窗口小部件显示工具提示。如果要控制工具提示的行为,则可以捕获QEvent::ToolTip事件。默认情况下,此属性包含一个空字符串。

42、toolTipDuration : int

小部件的工具提示显示时间(单位:毫秒)。 如果该值为-1(默认值),则根据工具提示的长度来计算持续时间。

43、updatesEnabled : bool        【注意】

是否启用更新。如果禁用更新,则调用 update() 和 repaint() 无效。默认为true。

禁用小部件会隐式禁用其所有子项。启用小部件会启用除顶层小部件或已明确禁用的所有子小部件之外的所有子小部件。重新启用更新会隐式调用小部件上的 update()。

setUpdatesEnabled() 通常用于在短时间内禁用更新,例如,避免在进行较大更改时出现屏幕闪烁。

  setUpdatesEnabled(false);
  bigVisualChanges();
  setUpdatesEnabled(true);

44、visible : bool

小部件是否可见。

当控件的可见性状态更改时,它会接收显示和隐藏事件。在隐藏事件和显示事件之间,无需浪费CPU周期来准备或向用户显示信息。

屏幕上其他窗口遮挡的小部件被视为可见。

当用户最小化窗口时发生自发的隐藏事件,并在再次恢复窗口时发生自发的显示事件。

45、whatsThis : QString

部件的“What's This”帮助文本信息。默认为空。

46、windowFilePath : QString

与小部件关联的文件路径。它将文件路径与窗口关联。如果设置了文件路径,但尚未设置窗口标题,则Qt会将窗口标题设置为使用 QFileInfo::fileName() 获得的指定路径的文件名。

    setWindowFilePath(QStringLiteral("D:\\学习OPenCV3.pdf"));

47、windowFlags : Qt::WindowFlags

窗口标志

更改窗口的标志时,将调用 setParent(),从而导致窗口小部件被隐藏。必须调用 show() 才能使小部件再次可见。

48、windowIcon : QIcon

小部件的图标。如果未设置任何图标,则 windowIcon() 返回应用程序图标(QApplication::windowIcon())。

49、windowModality : Qt::WindowModality

窗口模态类型。默认为Qt::NonModal

Qt::Window类型的小部件此属性才有意义。

模在窗口可见的情况下更改此属性无效,必须先 hide() 小部件,然后再 show()。

  • Qt::NonModal:无模态。
  • Qt::WindowModal:单个窗口层次结构的模态,阻止输入到其父窗口、所有祖父母窗口、其父窗口和祖父母窗口的所有同级窗口。
  • Qt::ApplicationModal:应用程序模态,阻止所有窗口的输入。

50、windowOpacity : double

窗口的不透明度级别。不透明度的有效范围是1.0(完全不透明)到0.0(完全透明)。默认情况下,此属性的值为1.0。

警告:将此属性从不透明更改为透明可能会发生绘制事件,需要正确处理窗口才能正确显示窗口。 这主要影响QScreen::grabWindow()的使用。还要注意,半透明窗口的更新和调整大小要比不透明窗口慢得多。

51、windowTitle : QString

窗口标题。此属性仅对顶级窗口小部件(如窗口和对话框)有意义。如果未设置标题,则标题基于windowFilePath。 如果都没有设置,则标题为空字符串。

四、成员函数

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 &region)

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

如果该区域包含小部件的 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 的快捷方式系统会在其父小部件被销毁时自动删除快捷方式。最好使用 QActionQShortcut 来处理快捷方式,因为它们比这个低级函数更容易使用。

      void setShortcutAutoRepeat(int id, bool enable = true)

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

      void setShortcutEnabled(int id, bool enable = true)

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

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

26、QGraphicsEffect * graphicsEffect()

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

      void setGraphicsEffect(QGraphicsEffect *effect)

设置小部件的图形效果。

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

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

QWidget 拥有效果的所有权。

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

注意:基于 OpenGL 的小部件不支持图形效果,例如 QGLWidgetQOpenGLWidget 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()。这种速度优化不会改变结果,因为在事件生成期间绘制区域会被裁剪到该区域。例如,QListViewQTableView 就是这样做的。

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() 相反。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QWidget(长文) 的相关文章

  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法

随机推荐

  • 厂房效果图制作

    关于厂房 工厂园区规划 及钢结构类项目效果图制作过程中所经常遇到的一些问题 在这里予以汇总整理 并对场景搭建的流程给予简述 三维场景创建 首先需要把CAD平面规划图纸 或是PDF电子版文档 或是手绘稿等弄清楚 场地占地多少亩 有多少厂房 办
  • 1.1 初识基准测试(Benchmark)

    基准测试 Benchmark 是Go语言中用于衡量代码性能的重要工具 通过编写基准测试函数 并使用testing B提供的方法来记录执行时间和其他指标 我们可以准确地评估代码的性能表现 在开发过程中 合理使用基准测试可以帮助我们优化代码 提
  • 面试系列之基础篇

    强引用 软引用 弱引用 虚引用 一般面试官会这样问 你知道Java中对象的引用类型有哪几种吗 分别讲讲这几种之间的区别 强引用 只要强引用还存在 垃圾收集器永远不会回收被引用的对象 软引用 描述一些还有用但是并非必需的对象 将要发生内存溢出
  • 深度学习与人脸识别系列(3)__基于VGGNet的人脸识别系统

    作者 wjmishuai 出处 http blog csdn net wjmishuai article details 50854155 声明 版权所有 转载请联系作者并注明出处 1 引言 本文中介绍的人脸识别系统是基于这两篇论文 Ver
  • java高qps接口设计_高并发后端设计-限流篇

    系统在设计之初就会有一个预估容量 长时间超过系统能承受的TPS QPS阈值 系统可能会被压垮 最终导致整个服务不够用 为了避免这种情况 我们就需要对接口请求进行限流 限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限
  • leetcode刷题:最大子序积

    1 题目 题解 实现上面的过程 class Solution public int maxProduct vector
  • 删除gitlab上的分支

    好久没有更新了 今天记录一下删除gitlab上的分支的操作 登录仓库后 依次点击 project gt home gt Readme gt repository gt branches 会看到所有master和所有分支 点击右侧删除即可 看
  • 剑指Offer(一):二维数组中查找最大值

    题目 这个题目说的是 给你一个二维数组 matrix 和一个目标值 target 你要在数组里找到这个目标值 然后返回它的行 列下标 如果找不到 则返回 1 1 这个数组的每一行都是从左向右递增 每一列都是从上到下递增 和 二维数组的二分搜
  • 首届《产业数字化金铲奖》榜单来袭

    出品 产业家 2021年 产业数字化是绝对的主题 在这个变幻莫测的一年里 越来越多的企业开始寻求数字化转型方向 它们在工业 农业 医疗 教育等等方向都在努力作出自己的数字化尝试 个体寻找数字进化之路 企业构建新的技术底层 产业定义互联网下半
  • 相机的坐标系转换(1)

    前言 常言道 工欲善其事 必先利其器 如欲明其理 必先定其义 后一句是我编的 不过 这句话还是有道理的 如果要想明白相机的坐标系之间的转换 那么必须明白相机有哪几个坐标系 并对它们下一个明确的定义 只有这样 我们接下来的工作才好开展 正文
  • Rose(双机热备)服务配置

    安装步骤省略 下面只讲配置 1 一般会设置两个job iis 及 sql 此次选择的是SqlServer 版本没有要求 大概流程是 两台服务器 都有不同的ip 内网或者外网 然后虚拟一个ip出来 比如 服务器A 192 168 100 1
  • Leetcode每日一题:面试题02.02.kth-node-from-end-of-list-lcci(返回倒数第k个节点)

    思路 典型得快慢指针问题 快指针与慢指针中间隔着k 2个节点 那么同时 快慢指针 当快指针指向链表结尾节点时 慢指针指向倒数第k个节点 struct ListNode int val ListNode next ListNode int x
  • Java:基于注解对类实例字段进行通用校验

    前言 后台服务处理前端的请求时 会有这样的一种需求 即校验请求中的参数是否符合校验规则 校验参数是否符合的一种方法是 罗列请求参数 基于校验规则一个一个的校验参数 如果存在不符合的 就返回字段值不符合规则的提示 通过就向下执行 这种方法是可
  • CSS线性渐变linear-gradient

    线性渐变是多种颜色沿着一条直线即渐变线过渡 发生渐变依靠渐变线和色标 其中渐变线来控制发生渐变的方向 色标包括颜色值和位置来控制渐变的色彩变化 创建一个线性渐变 需要指定两种颜色 还可以实现不同方向 指定为一个角度 的渐变效果 如果不指定方
  • 文件上传-.user.ini的妙用

    小伙伴们大家好 本期为大家带来的是 user ini在文件上传漏洞中的妙用 目录 user ini user ini的妙用原理 利用 user ini的环境 实战演示 1 先尝试直接上传webshell 2 看是否能够上传除php和png外
  • img标签和p标签是行内元素还是块级元素?以及p标签中可以放img标签吗?

    img标签 行内块元素 类似于 inline block 可以被p标签包裹 比如p是居中 图片也中了 p标签 块级元素 默认宽度占满一行 HTML p 是段落标签 除了可以添加文字内容外 完全可以添加其他html标签也包括IMG图片标签 其
  • 十大热门编程语言的介绍

    小编给大家分享一篇关于现阶段十大热门编程语言的文章 经过流行的搜索引擎 如谷歌 必应 雅虎 维基百科 亚马逊 YouTube和百度 用于计算评级 得出十大热门编程语言排行榜的榜单 根据百度百科以及网上查阅总结分析以上十大热门编程语言的介绍
  • 安全体系建立标准

    随着我国企业信息化的普及 信息化给我国企业带来积极影响的同时 也带来了信息安全方面的消极影响 一方面信息化在企业发展的过程中 对节约企业成本和达到有效管理起到了积极的推动作用 另一方面伴随着全球信息化和网络化进程的发展 与此相关的信息安全问
  • mysql中索引的null值问题

    在mysql中 对含有null值的索引列 以及is null is not null的查询条件是否会走索引这点 网上有很多说法 为此我自己单独做了个实验 首先创建两张表 一张表所有字段默认为null 另一张表所有字段默认为not null
  • QWidget(长文)

    一 描述 1 QWidget 是用户界面的原子 它从窗口系统接收鼠标 键盘和其他事件 并在屏幕上绘制自己的表示 每个小部件都是矩形的 它们按Z顺序排序 小部件由其父部件和它前面的小部件剪裁 2 未嵌入父窗口小部件的 QWidget 称为窗口