文章目录
QWidget Class
QWidget类是所有用户界面对象的基类。
Header | #include < QWidget > |
---|---|
qmake | QT += widgets |
Inherits | QObject and QPaintDevice |
Inherited By | QAbstractButton, QAbstractSlider, QAbstractSpinBox, QCalendarWidget, QComboBox, QDesignerActionEditorInterface, QDesignerFormWindowInterface, QDesignerObjectInspectorInterface, QDesignerPropertyEditorInterface, QDesignerWidgetBoxInterface, QDesktopWidget, QDialog, QDialogButtonBox, QDockWidget, QFocusFrame, QFrame, QGroupBox, QKeySequenceEdit, QLineEdit, QMacCocoaViewContainer, QMacNativeWidget, QMainWindow, QMdiSubWindow, QMenu, QMenuBar, QOpenGLWidget, QProgressBar, QQuickWidget, QRubberBand, QSizeGrip, QSplashScreen, QSplitterHandle, QStatusBar, QSvgWidget, QTabBar, QTabWidget, QToolBar, and QWizardPage |
详细说明
小部件是用户界面的原子:它接收来自窗口系统的鼠标、键盘和其他事件,并在屏幕上绘制自己的表示。每个部件都是矩形的,它们是按z轴顺序排序的。一个小部件被它的父部件和它前面的小部件剪辑。
未嵌入到父窗口小部件中的窗口小部件称为窗口。通常,窗口具有框架和标题栏,尽管也可以使用适当的窗口标记来创建没有这种修饰的窗口。在Qt中,QMainWindow 和 QDialog 的各种子类是最常见的窗口类型。
每个小部件的构造函数都接受一个或两个标准参数:
QWidget * parent = nullptr
是新窗口小部件的父级。如果它是nullptr(默认值) ,则新窗口小部件将是一个窗口。如果不是,它将是父对象的子对象,并受父对象的几何形状约束(除非您将Qt::Window指定为窗口标志) 。Qt::WindowFlags f = {}
(如果有) 设置窗口标志;默认值适用于几乎所有小部件,但是要获取例如没有窗口系统框架的窗口,必须使用特殊标志。
QWidget有很多成员函数,但是其中一些没有直接的功能。例如,QWidget具有font属性,但从未使用过它。有许多子类提供了真正的功能,例如QLabel,QPushButton,QListWidget和QTabWidget。
顶层和子级小部件
没有父部件的小部件始终是一个独立的窗口(顶层窗口小部件) 。 对于这些小部件,setWindowTitle() 和setWindowIcon() 分别设置标题栏和图标。
非窗口小部件是子部件,显示在它们的父小部件中。Qt中的大多数小部件主要作为子小部件使用。例如,可以将按钮显示为顶级窗口,但是大多数人更喜欢将他们的按钮放在其他小部件中,比如QDialog。
上图显示了一个QGroupBox小部件,用于在QGridLayout提供的布局中保留各种子级小部件。 QLabel子小部件已概述以指示其完整大小。
如果要使用QWidget来容纳子小部件,通常需要向父QWidget添加布局。 有关更多信息,请参见Layout Management。
组合小部件
当小部件用作对多个子小部件进行分组的容器时,它称为复合小部件。 可以通过构造具有所需视觉属性的小部件(例如QFrame) 并将其添加子小部件(通常由布局管理) 来创建这些小部件。 上图显示了使用Qt Designer创建的复合小部件。
可以通过子类化标准小部件(例如QWidget或QFrame) ,然后在子类的构造函数中添加必要的布局和子小部件来创建复合小部件。 Qt提供的许多示例都使用这种方法,【Qt Tutorials】也介绍了这种方法。
自定义小部件和绘画
由于 QWidget 是 QPaintDevice 的子类,因此可以使用子类来显示自定义内容,该内容是由 QPainter 类的实例进行一系列绘画操作组成的。 这种方法与“图形视图框架”所使用的画布样式方法形成对比,在【Graphics View Framework】图形视图框架中,项目由应用程序添加到场景,并由框架本身进行渲染。
每个小部件都从其paintEvent() 函数内执行所有绘画操作。 每当由于外部更改或应用程序要求而需要重新绘制窗口小部件时,都会调用此方法。
Analog Clock example
显示了一个简单的小部件如何处理绘制事件。
大小提示和大小策略
在实现一个新的小部件时,重新实现 sizeHint() 为小部件提供一个合理的默认大小**并使用 **setSizePolicy() 设置正确的大小策略几乎总是有用的。
默认情况下,不提供大小提示的组合小部件将根据其子小部件的空间需求调整大小。
尺寸策略允许您为布局管理系统提供良好的默认行为,以便其他小部件可以轻松地包含和管理您的小部件。默认的大小策略表示大小提示表示小部件的首选大小,对于许多小部件来说,这通常已经足够好了。
注意:顶级小部件的大小限制在桌面高度和宽度的2/3。如果这些边界不充分,可以手动调整小部件的大小。
事件
窗口小部件响应通常由用户操作引起的事件。 Qt通过使用包含有关每个事件信息的QEvent子类的实例调用特定的事件处理函数来将事件传递给窗口小部件。
如果您的窗口小部件仅包含子窗口小部件,则可能不需要实现任何事件处理程序。 如果要检测鼠标单击子窗口小部件,请在窗口小部件的mousePressEvent() 中调用子窗口的underMouse() 函数。
【Scribble example】实现了一组更广泛的事件来处理鼠标移动、按钮按下和窗口调整大小。
需要提供自己的窗口小部件的行为和内容,但是这里是与QWidget相关的事件的简要概述,从最常见的事件开始:
- 每当重新绘制小部件时,都会调用paintEvent() 。每个自定义内容的窗口小部件都必须实现它。使用QPainter的绘制只能在paintEvent() 或paintEvent() 调用的函数中进行。
- 调整小部件的大小时,将调用resizeEvent() 。
- 当鼠标光标在小部件内部时按下鼠标按钮,或者小部件使用grabMouse()抓取鼠标时,将调用mousePressEvent()。按下鼠标而不释放它实际上与调用grabMouse()相同。
- 当释放鼠标按钮时调用mouseReleaseEvent()。当小部件收到相应的鼠标按下事件时,它将接收鼠标释放事件。这意味着,如果用户在小部件内按下鼠标,然后在释放鼠标按钮之前将鼠标拖动到其他地方,那么小部件就会接收到释放事件。但有一个例外:如果在按住鼠标按钮时弹出菜单出现,这个弹出菜单会立即窃取鼠标事件。
- 当用户在小部件中双击时,将调用mouseDoubleClickEvent()。如果用户双击,小部件将接收一个鼠标按下事件、一个鼠标释放事件(一个鼠标单击事件)、第二个鼠标按下事件以及最后一个鼠标释放事件。(如果在操作过程中鼠标不保持稳定,也会接收到一些鼠标移动事件。)在第二次单击到达之前,无法区分单击和双击。(这就是为什么大多数GUI书籍建议双击是单击的扩展,而不是触发不同的动作的原因之一。)
接受键盘输入的小部件需要重新实现更多的事件处理程序:
- 每当按下一个键时,就会调用keyPressEvent(),当按下一个键足够长的时间导致自动重复时,也会再次调用keyPressEvent()。只有焦点更改机制未使用时,按下Tab和Shift+Tab键时,才会将keyPressEvent()传递给小部件。要强制小部件处理这些键,必须重新实现QWidget::event()。
- focusInEvent()在小部件获得键盘焦点时被调用(假设您已经调用了setFocusPolicy())。表现良好的小部件表明它们以一种清晰而谨慎的方式拥有键盘焦点。
- 当小部件失去键盘焦点时,将调用focusOutEvent() 。
您可能还需要重新实现一些不太常见的事件处理程序:
- 只要在按住鼠标按钮的同时移动鼠标,就会调用mouseMoveEvent() 。这在拖放操作期间很有用。如果调用setMouseTracking(true) ,即使没有按下任何按钮,也可以获得鼠标移动事件。 (另请参见拖放指南)
- 每当释放键并按住键时(如果键是自动重复的) ,都会调用keyReleaseEvent() 。在这种情况下,小部件每次重复都会收到一对按键释放和按键事件。 Tab和Shift + Tab键仅在焦点更改机制未使用时才传递给小部件。要强制这些键由您的窗口小部件处理,必须重新实现QWidget::event() 。
- 每当用户在小部件具有焦点的情况下转动鼠标滚轮时,就会调用wheelEvent() 。
- 当鼠标进入小部件的屏幕空间时,将调用enterEvent() 。 (这不包括小部件的任何子级拥有的屏幕空间。)
- 当鼠标离开小部件的屏幕空间时,将调用LeaveEvent() 。如果鼠标进入子窗口小部件,则不会导致leaveEvent() 。
- 当窗口小部件已相对于其父级移动时,将调用moveEvent() 。
- 当用户关闭窗口小部件时(或调用close() 时) ,将调用closeEvent() 。
QEvent::Type文档中还描述了一些不太明显的事件。 要处理这些事件,您需要直接重新实现event() 。
函数event() 的默认实现处理Tab和Shift + Tab(以移动键盘焦点),并将大多数其他事件传递给上述更专门的处理程序之一。
事件及其传递机制在事件系统中介绍【The Event System】。
函数和属性组
组 | 函数和属性 |
---|---|
窗口函数 | show(), hide(), raise(), lower(), close(). |
顶级窗口 | windowModified, windowTitle, windowIcon, isActiveWindow, activateWindow(), minimized, showMinimized(), maximized, showMaximized(), fullScreen, showFullScreen(), showNormal(). |
窗口内容 | update(), repaint(), scroll(). |
几何大小 | pos, x(), y(), rect, size, width(), height(), move(), resize(), sizePolicy, sizeHint(), minimumSizeHint(), updateGeometry(), layout(), frameGeometry, geometry, childrenRect, childrenRegion, adjustSize(), mapFromGlobal(), mapToGlobal(), mapFromParent(), mapToParent(), maximumSize, minimumSize, sizeIncrement, baseSize, setFixedSize() |
Mode | visible, isVisibleTo(), enabled, isEnabledTo(), modal, isWindow(), mouseTracking, updatesEnabled, visibleRegion(). |
感观 | style(), setStyle(), styleSheet, cursor, font, palette, backgroundRole(), setBackgroundRole(), fontInfo(), fontMetrics(). |
键盘焦点 | focus, focusPolicy, setFocus(), clearFocus(), setTabOrder(), setFocusProxy(), focusNextChild(), focusPreviousChild(). |
键鼠抓取 | grabMouse(), releaseMouse(), grabKeyboard(), releaseKeyboard(), mouseGrabber(), keyboardGrabber(). |
事件处理 | event(), mousePressEvent(), mouseReleaseEvent(), mouseDoubleClickEvent(), mouseMoveEvent(), keyPressEvent(), keyReleaseEvent(), focusInEvent(), focusOutEvent(), wheelEvent(), enterEvent(), leaveEvent(), paintEvent(), moveEvent(), resizeEvent(), closeEvent(), dragEnterEvent(), dragMoveEvent(), dragLeaveEvent(), dropEvent(), childEvent(), showEvent(), hideEvent(), customEvent(). changeEvent(), |
系统函数 | parentWidget(), window(), setParent(), winId(), find(), metric(). |
上下文菜单 | contextMenuPolicy, contextMenuEvent(), customContextMenuRequested(), actions() |
交互帮助 | setToolTip(), setWhatsThis() |
小部件样式表
除了每个平台的标准窗口小部件样式外,还可以根据样式表中指定的规则来设置窗口小部件的样式。 此功能使您可以自定义特定小部件的外观,以向用户提供有关其用途的视觉提示。 例如,可以以特定方式设置按钮样式,以指示其执行了破坏性操作。
Qt样式表文档中更详细地描述了小部件样式表的使用。Qt Style Sheets
透明度和双缓冲
从Qt 4.0开始,QWidget自动对其绘画进行双缓冲,因此无需在paintEvent() 中编写双缓冲代码来避免闪烁。
从Qt 4.1开始,不建议使用Qt::WA_ContentsPropagated小部件属性。 而是默认情况下,只要未设置Qt::WA_PaintOnScreen,父窗口小部件的内容就会传播到它们的每个子窗口。 可以编写自定义窗口小部件以利用此功能,方法是更新不规则区域(以创建非矩形子窗口小部件) ,或者使用少于完整alpha分量的颜色进行绘画。 下图显示了如何微调自定义窗口小部件的属性和属性以实现不同的效果。
在上图中,构造了一个删除区域的半透明矩形子窗口小部件并将其添加到父窗口小部件(显示像素图的QLabel) 。 然后,设置不同的属性和窗口小部件属性以实现不同的效果:
- 左边窗口小部件未设置其他属性或窗口小部件属性。 此默认状态适合大多数使用透明度的自定义窗口小部件,它们的形状不规则,或者不使用不透明的笔刷在其整个区域上绘制。
- 中间的窗口小部件具有autoFillBackground属性集。 此属性与依赖于小部件提供默认背景的自定义小部件一起使用,并且不使用不透明的笔刷在其整个区域上绘制。
- 右边的窗口小部件设置了Qt::WA_OpaquePaintEvent窗口小部件属性。 这表示该小部件将使用不透明的颜色在其整个区域上绘画。 窗口小部件的区域最初将是未初始化的,在图中以红色斜线网格图案表示,该图案在覆盖区域上发光。 Qt::WA_OpaquePaintArea属性对于需要快速绘制自己专用内容且不需要默认填充背景的小部件很有用。
要使用简单的背景颜色快速更新自定义窗口小部件,例如实时绘图或图形化窗口小部件,最好定义合适的背景颜色(使用带有QPalette::Window角色的setBackgroundRole() ) ,设置autoFillBackground属性,并且仅在小部件的paintEvent() 中实现必要的绘图功能。
为了快速更新不断用不透明内容在其整个区域上绘制的自定义窗口小部件,例如视频流窗口小部件,最好设置窗口小部件的Qt::WA_OpaquePaintEvent,避免与重新绘制窗口小部件的背景相关的不必要的开销。
如果小部件同时具有Qt::WA_OpaquePaintEvent小部件属性和autoFillBackground属性集,则Qt::WA_OpaquePaintEvent属性具有优先权。根据您的要求,您应该选择其中之一。
从Qt 4.1开始,父小部件的内容也传播到标准Qt小部件。如果父窗口小部件以非标准方式进行装饰,则可能导致某些意外结果,如下图所示。
在不使用子类化的情况下,定制标准Qt小部件的绘制行为的范围比定制小部件的范围要小一些。通常,标准小部件的理想外观可以通过设置autoFillBackground属性来实现。
创建半透明窗口
从Qt 4.5开始,就可以在支持合成的窗口系统上创建具有半透明区域的窗口。
要在顶级窗口小部件中启用此功能,请使用setAttribute() 设置其Qt::WA_TranslucentBackground属性,并确保其背景在要部分透明的区域中涂有不透明的颜色。
平台说明:
- X11:此功能依赖于使用支持ARGB视觉效果的X服务器和合成窗口管理器。
- Windows:窗口小部件需要设置Qt::FramelessWindowHint窗口标志才能使半透明起作用。
本地小部件与外来部件
在Qt 4.4中引入的外来小部件是窗口系统所不知道的小部件。它们没有与之关联的本机窗口句柄。该特性显著加快了小部件的绘制、调整大小和消除闪烁。
如果您需要本机窗口的旧行为,则可以选择以下选项之一:
- 在您的环境中使用QT_USE_NATIVE_WINDOWS = 1。
- 在您的应用程序上设置Qt::AA_NativeWindows属性。 所有小部件都是本机小部件。
- 在小部件上设置Qt::WA_NativeWindow属性:小部件本身及其所有祖先将变为本机(除非设置了Qt::WA_DontCreateNativeAncestors) 。
- 调用QWidget::winId强制执行本机窗口(这意味着3) 。
- 设置Qt::WA_PaintOnScreen属性以强制执行本机窗口(这意味着3) 。
公共类型
enum RenderFlag
flags RenderFlags
RenderFlag枚举描述了调用QWidget::render()时如何呈现窗口小部件。
Constant | Value | Description |
---|---|---|
DrawWindowBackground | 0x1 | 如果启用此选项,即使没有设置autoFillBackground,小部件的背景也会呈现到目标中。默认情况下,此选项是启用的。 |
DrawChildren | 0x2 | 如果启用此选项,小部件的子部件将递归地呈现到目标中。默认情况下,这个选项是启用的。 |
IgnoreMask | 0x4 | 如果启用此选项,则在将小部件呈现到目标时将忽略小部件的QWidget::mask()。默认情况下,此选项是禁用的。 |
属性
位置大小
位置大小,有专门的技术章节【Window and Dialog Widgets 】- 【Window Geometry】中
-
x : const int 小部件相对于其父窗口的x坐标
- int x() const
-
y : const int 小部件相对于其父窗口的y坐标
- int y() const
-
pos : QPoint 小部件在其父窗口小部件内的位置
如果小部件是窗口,则位置是桌面上窗口小部件(包括其框架) 的位置。
默认情况下,此属性包含一个指向原点的位置。- QPoint pos() const
- void move(const QPoint &)
- void move(int x, int y)
-
width : const int 小部件的宽度
不包括任何窗口框架, 注意:请勿使用此功能在多屏幕桌面上查找屏幕的宽度。- int width() const
-
height : const int 小部件的高度
不包括任何窗口框架
- int height() const
-
geometry : QRect 小部件相对于其父部件的几何
不包括窗口框架- const QRect & geometry() const
- void setGeometry(const QRect &)
- void setGeometry(int x, int y, int w, int h)
- rect : const QRect 小部件的内部矩形(不包括任何窗口框架)
rect属性等于QRect(0,0, width(), height())。
- QRect rect() const
-
size : QSize 小部件的大小(不包括任何窗口框架)
- QSize size() const
- void resize(const QSize &)
- void resize(int w, int h)
- frameGeometry : const QRect 相对于其父部件的几何形状
包括任何窗口框架
- QRect frameGeometry() const
- frameSize : const QSize 小部件的大小
包括任何窗口框架 默认情况下,该属性包含一个依赖于用户平台和屏幕几何形状的值。
- QSize frameSize() const
-
maximumHeight : int 默认:16777215 小部件的最大高度(以像素为单位)
注意:QWIDGETSIZE_MAX宏的定义限制了小部件的最大大小。- int maximumHeight() const
- void setMaximumHeight(int maxh)
-
maximumWidth : int 默认:16777215 小部件的最大宽度(以像素为单位)
- int maximumWidth() const
- void setMaximumWidth(int maxw)
-
maximumSize : QSize 默认:QSize(16777215,16777215) 小部件的最大大小(以像素为单位)
- QSize maximumSize() const
- void setMaximumSize(const QSize &)
- void setMaximumSize(int maxw, int maxh)
-
minimumHeight : int ==小部件的最小高度(以像素为单位) ==
- int minimumHeight() const
- void setMinimumHeight(int minh)
-
minimumWidth: int 小部件的最小宽度
- int minimumWidth() const
- void setMinimumWidth(int minw)
-
minimumSize : QSize 小部件的最小大小
- minimumSize() const
- void setMinimumSize(const QSize &)
- void setMinimumSize(int minw, int minh)
- minimumSizeHint : constQSize 小部件的建议最小大小
如果没有此小部件的布局,minimumSizeHint()的默认实现将返回无效的大小,否则,将返回布局的最小大小。大多数内置窗口小部件会重新实现minimumSizeHint()。 除非设置了minimumSize()或将大小策略设置为QSizePolicy::Ignore,否则QLayout绝不会将窗口小部件的大小调整为小于最小大小提示。如果设置了minimumSize(),则最小尺寸提示将被忽略。
- virtual QSize minimumSizeHint() const
-
baseSize : QSize 小部件的基本大小
如果窗口小部件定义sizeIncrement(),则基本大小用于计算适当的窗口小部件大小。- QSize baseSize() const
- void setBaseSize(const QSize &)
- void setBaseSize(int basew, int baseh)
- sizeHint : const QSize 小部件的建议大小
如果没有这个小部件的布局,sizeHint()的默认实现将返回一个无效的大小,否则将返回布局的首选大小。
- virtual QSize sizeHint() const
-
sizeIncrement : QSize 默认:QSize(0,0) 小部件的大小增量
当用户调整窗口的大小时,大小将按照sizeIncrement().width()像素水平移动和sizeIncrement.height()像素垂直移动的步骤移动,以baseSize()为基础。
首选小部件大小是为非负整数 i 和 j :width =baseSize().width() + i * sizeIncrement().width(); height=baseSize().height() +j * sizeIncrement().height();
注意,虽然可以为所有小部件设置大小增量,但它只影响窗口。
默认情况下,此属性包含一个宽度和高度为零的大小。
警告:大小增加在Windows下无效,并且X11上的窗口管理器可能会忽略它。- QSize sizeIncrement() const
- void setSizeIncrement(const QSize &)
- void setSizeIncrement(int w, int h)
-
sizePolicy : QSizePolicy 小部件的默认布局行为
如果有一个QLayout管理这个小部件的子部件,则使用该布局指定的大小策略。如果没有这样的QLayout,则使用此函数的结果。
默认策略是Preferred/Preferred,这意味着小部件可以自由调整大小,但更喜欢使用sizeHint()返回的大小。类似于按钮的小部件设置大小策略,以指定它们可以水平伸缩,但可以垂直固定。这同样适用于LineEdit控件(如QLineEdit、QSpinBox或可编辑的QComboBox)和其他水平方向的小部件(如QProgressBar)。QToolButton通常是方形的,所以它们允许双向增长。支持不同方向的小部件(如QSlider、QScrollBar或QHeader)只指定各自方向上的拉伸。可以提供滚动条的小部件(通常是QScrollArea的子类)倾向于指定它们可以使用额外的空间,并且它们可以使用小于sizeHint()的工具。- QSizePolicy sizePolicy() const
- void setSizePolicy(QSizePolicy)
- void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
-
maximized : const bool 此属性保存此小部件是否最大化
此属性仅适用于windows。
- bool isMaximized() const
-
minimized : const bool 默认:false 此属性保存是否最小化此小部件(图标化)
此属性仅适用于windows。
- bool isMinimized() const
-
normalGeometry : const QRect 默认:空矩形 小部件的几何形状
作为普通(不是最大化或全屏)顶级小部件显示时将会显示出来 对于子部件,此属性始终保持为空矩形。- QRect normalGeometry() const
-
childrenRect : const QRect 此属性保存小部件的子项的边界矩形
隐藏的子项被排除在外。 默认情况下,对于没有子项的窗口小部件,此属性包含位于原点的宽度和高度为零的矩形。-- QRect childrenRect() const -
childrenRegion : const QRegion 此属性保存小部件的子项占用的合并区域
隐藏的子项被排除在外。 默认情况下,对于没有子项的窗口小部件,此属性包含一个空白区域。
- QRegion childrenRegion() const
状态显示
-
enabled : bool 此属性保存是否启用了小部件
通常,已启用的窗口小部件处理键盘和鼠标事件。禁用的小部件则不会。QAbstractButton例外。 禁用小部件会隐式禁用其所有子项。分别启用所有子控件,除非已明确禁用它们。当其父窗口小部件保持禁用状态时,不可能显式启用不是窗口的子窗口小部件。
Access functions:- bool isEnabled() const
- void setEnabled(bool)
-
fullScreen : const bool 此属性用于保存小部件是否以全屏模式显示
全屏模式下的小部件占据整个屏幕区域,不显示标题栏等窗口装饰。 默认情况下,此属性为false。
- bool isFullScreen() const
-
isActiveWindow : const bool 此属性保存此小部件的窗口是否是活动窗口
活动窗口是包含具有键盘焦点的小部件的窗口(如果没有小部件或没有小部件接受键盘焦点,窗口可能仍然具有焦点)。 当弹出窗口可见时,此属性对活动窗口和弹出窗口都为真。
- bool isActiveWindow() const
-
layoutDirection : Qt::LayoutDirection 此属性保存此小部件的布局方向
当在小部件上设置布局方向时,它将传播到小部件的子组件,但不会传播到窗口的子组件,也不会传播到已显式调用setLayoutDirection()的子组件。此外,在setLayoutDirection()之后添加的子部件已经被调用,因为父组件不继承父组件的布局方向。
- Qt::LayoutDirection layoutDirection() const
- void setLayoutDirection(Qt::LayoutDirection direction)
- void unsetLayoutDirection()
-
visible : bool 小部件是否可见
如果窗口的所有父窗口小部件都可见,则调用setVisible(true) 或show() 会将窗口小部件设置为可见状态。
如果祖先不可见,则在显示其所有祖先之前,该窗口小部件将不可见。如果其大小或位置已更改,则Qt保证窗口小部件在显示之前就获得移动和调整大小的事件。如果尚未调整窗口小部件的大小,Qt将使用adjustSize() 将窗口小部件的大小调整为有用的默认值。调用setVisible(false) 或hide() 会显式隐藏小部件。除非您显示它,否则即使它的所有祖先都可见,显式隐藏的窗口小部件也将永远不可见。
当控件的可见性状态更改时,它会接收显示和隐藏事件。在隐藏事件和显示事件之间,无需浪费CPU周期来准备或向用户显示信息。例如,视频应用程序可能只是停止生成框架。
屏幕上其他窗口遮挡的小部件被视为可见。图标化的窗口和存在于另一个虚拟桌面上(支持此概念的平台上) 的窗口也是如此。当窗口系统更改其映射状态时,例如,窗口小部件会自发地显示和隐藏事件。当用户最小化窗口时发生自发的隐藏事件,并在再次恢复窗口时发生自发的显示事件。
您几乎不需要重新实现setVisible() 函数。如果需要在显示小部件之前更改某些设置,请改用showEvent() 。如果您需要进行一些延迟的初始化,请使用传递给event() 函数的Polish事件。
- bool isVisible() const
- virtual void setVisible(bool visible)
-
windowOpacity : double 默认:1.0。 窗口的不透明度级别
不透明度的有效范围是1.0(完全不透明)到0.0(完全透明)。 在支持Composite扩展的EmbeddedLinux,macOS,Windows和X11平台上可以使用此功能。
注意:在X11上,你需要有一个复合管理器运行,并且X11特定的 _net_wm_window_透明度原子需要被你正在使用的窗口管理器支持。
警告:将此属性从不透明更改为透明可能会发出一个绘制事件,在窗口正确显示之前需要处理该事件。这主要影响QPixmap::grabWindow()的使用。还要注意,半透明的窗口更新和调整大小要比不透明的窗口慢得多。
- qreal windowOpacity() const
- void setWindowOpacity(qreal level)
颜色样式
-
1)、autoFillBackground : bool 默认:false 此属性保存是否自动填充小部件背景
如果启用,此属性将导致Qt在调用paint事件之前填充小部件的背景。使用的颜色由小部件调色板中的QPalette::Window颜色角色定义。 此外,除非设置了WA_OpaquePaintEvent或WA_NoSystemBackground属性,否则Windows始终会用QPalette::Window填充。 如果小部件的父级对其背景具有静态渐变,则无法关闭此属性。 警告:请谨慎使用此属性和Qt样式表。当窗口小部件的样式表具有有效的背景或边框图像时,将自动禁用此属性。
- bool autoFillBackground() const
- void setAutoFillBackground(bool enabled)
setAutoFillBackground (true) setAutoFillBackground (false) 2)、palette : QPalette 保存小部件的调色板
呈现标准组件时,该小部件的样式使用该调色板,并且可用来确保自定义小部件可以保持与本机平台外观的一致性。通常,不同的平台或不同的样式具有不同的调色板。
小部件的背景角色的调色板项目用于填充小部件的背景(请参阅QWidget::autoFillBackground) ,而前景角色则初始化QPainter的笔。
QApplication维护一个系统/主题面板,它是所有小部件的默认选项。对于某些类型的小部件,可能还会有特殊的调色板默认设置(例如,在Windows Vista上,从QMenuBar派生的所有类都具有特殊的默认调色板) 。您还可以通过将自定义调色板和小部件名称传递给QApplication::setPalette() 来为小部件定义默认调色板。最后,样式始终可以选择在分配调色板时对其进行抛光(请参见QStyle::polish() ) 。
QWidget将显式地把调色板角色从父级传播到子级。如果将画笔或颜色分配给调色板上的特定角色,然后将该调色板分配给小部件,则该角色将传播到所有小部件的子级,从而覆盖该角色的所有系统默认值。
请注意,除非启用了Qt::WA_WindowPropagation属性,否则默认情况下,调色板不会传播到窗口(请参见isWindow() ) 。QWidget的调色板传播类似于其字体传播。
当前样式用于呈现所有标准Qt小部件的内容,可以自由地从小部件调色板中选择颜色和画笔,或者在某些情况下可以忽略(部分或全部) 调色板。特别是,某些样式(例如GTK样式,Mac样式和Windows Vista样式) 依赖于第三方API来呈现窗口小部件的内容,并且这些样式通常不遵循调色板。因此,不能保证将角色分配给窗口小部件的调色板会更改窗口小部件的外观。相反,您可以选择应用styleSheet。
警告:请勿将此功能与Qt样式表一起使用。使用样式表时,可以使用“color”,“background-color”,“selection-color”,“selection-background-color”和“alternate-background-color”来自定义窗口小部件的调色板。
- const QPalette & palette() const
- void setPalette(const QPalette &)
-
3)、styleSheet : QString 样式表文本
此属性保存小部件的样式表 样式表包含对小部件样式的自定义的文本描述,如Qt样式表文档中所述。 从Qt4.5开始,Qt样式表完全支持macOS。 警告:自定义QStyle子类当前不支持Qt样式表。我们计划在将来的版本中解决此问题。
- QString styleSheet() const
- void setStyleSheet(const QString &styleSheet)
-
4)、updatesEnabled : bool 默认:true 是否启用更新
启用了更新的窗口小部件会接收绘画事件并具有系统背景;禁用的小部件则不会。这也意味着如果禁用更新,则调用update()和repaint()无效。 setUpdatesEnabled()通常用于在短时间内禁用更新,例如,避免在进行较大更改时出现屏幕闪烁。 setUpdatesEnabled(false); bigVisualChanges(); setUpdatesEnabled(true); 禁用小部件会隐式禁用其所有子项。启用窗口小部件将启用所有子窗口小部件,但顶级窗口小部件或已被明确禁用的子窗口小部件。重新启用更新会隐式调用小部件上的update()。
- bool updatesEnabled() const
- void setUpdatesEnabled(bool enable)
-
5)、**font : QFont 保存小部件当前设置的字体
字体在呈现标准组件时由小部件的样式使用,并且可以作为一种手段来确保自定义小部件可以与本机平台的外观保持一致。不同的平台或不同的样式为应用程序定义不同的字体是很常见的。
当您将新字体分配给小部件时,该字体的属性将与小部件的默认字体相结合,形成小部件的最终字体。可以调用fontInfo()来获得小部件最终字体的副本。最后的字体也用于初始化QPainter的字体。
QApplication维护一个系统/主题字体,它是所有小部件的默认字体。对于某些类型的小部件也可能有特殊的字体默认设置。您还可以通过将自定义字体和小部件的名称传递给QApplication::setFont()来为小部件定义默认字体。最后,将字体与Qt的字体数据库进行匹配,以找到最佳匹配。
QWidget将显式字体属性从父元素传播到子元素。如果更改字体上的特定属性并将该字体分配给小部件,该属性将传播到小部件的所有子元素,覆盖该属性的任何系统默认值。注意,在默认情况下,字体不会传播到windows(参见isWindow()),除非Qt::WA_WindowPropagation属性被启用。
QWidget的字体传播类似于它的调色板传播。 当前的样式用于呈现所有标准Qt小部件的内容,可以自由选择使用小部件字体,或者在某些情况下忽略它(部分或全部)。特别是,某些样式(如GTK样式、Mac样式和WindowsVista样式)对小部件字体进行了特殊修改,以匹配平台的本机外观和感觉。因此,不能保证为小部件的字体分配属性就一定会改变小部件的外观。相反,您可以选择应用样式表。
注意:如果Qt样式表与setFont() 在同一个小部件上使用,那么如果设置冲突,样式表将优先。
- const QFont & font() const
- void setFont(const QFont &)
附属功能
-
1)、cursor : QCursor 默认:Qt::ArrowCursor 小部件的光标形状
鼠标光标悬停在此小部件上时将采用此形状。有关一系列有用形状的信息,请参见预定义光标对象的列表。
默认情况下,此属性包含具有Qt::ArrowCursor形状的光标。如果鼠标离开小部件,即使鼠标被抓住,一些底层的窗口实现也会重置游标。
如果要为所有窗口小部件设置光标,即使在窗口之外,可以考虑QGuiApplication::setOverrideCursor() 。
- QCursor cursor() const
- void setCursor(const QCursor &)
- void unsetCursor()
-
2)、contextMenuPolicy : Qt::ContextMenuPolicy 小部件如何显示上下文菜单
此属性的默认值为Qt::DefaultContextMenu,这意味着将调用contextMenuEvent()处理程序。其他值是Qt::NoContextMenu,Qt::PreventContextMenu,Qt::ActionsContextMenu和Qt::CustomContextMenu。使用Qt::CustomContextMenu,将发出信号customContextMenuRequested()。
-
Qt::ContextMenuPolicy contextMenuPolicy() const
-
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
-
3)、locale : QLocale 保存小部件的区域设置
只要没有设置特殊的语言环境,这就是父语言环境或者(如果此小部件是顶级小部件)缺省语言环境。 如果小部件显示日期或数字,应该使用小部件的语言环境对其进行格式化。
-
QLocale locale() const
-
void setLocale(const QLocale &locale)
-
4)、statusTip : QString 保存小部件的状态提示
-
QString statusTip() const
- void setStatusTip(const QString &)
-
5)、toolTip : QString
此属性保存小部件的工具提示 请注意,默认情况下,工具提示仅显示为活动窗口的子窗口小部件。通过在窗口上设置属性Qt::WA_AlwaysShowToolTips,而不是在带有工具提示的小部件上设置属性Qt::WA_AlwaysShowToolTips,可以更改此行为。 如果要控制工具提示的行为,可以截取event()函数并捕获QEvent::ToolTip事件(例如,如果要自定义工具提示应显示的区域)。 默认情况下,此属性包含空字符串。- QString toolTip() const
- void setToolTip(const QString &)
-
6)、toolTipDuration : int
此属性保存小部件的工具提示持续时间 指定工具提示显示的时间,以毫秒为单位。如果值为-1(默认值),则根据工具提示的长度计算持续时间。 这个属性是在Qt5.2中引入的。- int toolTipDuration() const
- void setToolTipDuration(int msec)
-
7)、whatsThis : QString
此属性保存小部件的" What’s This help text "。 默认情况下,此属性包含一个空字符串。
-
QString whatsThis() const
-
void setWhatsThis(const QString &)
-
8)、focus : const bool 默认:false
此属性保存此小部件(或其焦点代理)是否具有键盘输入焦点
-
bool hasFocus() const
-
9)、focusPolicy : Qt::FocusPolicy 小部件接受键盘焦点的方式
策略是 – Qt::TabFocus(通过制表键接受键盘焦点),Qt::ClickFocus(通过单击接受焦点),Qt::StrongFocus(两者都接受),Qt::NoFocus(默认)(根本不接受焦点)。 如果小部件处理键盘事件,则必须为其启用键盘焦点。这通常是通过小部件的构造函数完成的。例如,QLineEdit构造函数调用setFocusPolicy(Qt::StrongFocus)。 如果小部件有一个焦点代理,那么焦点策略将传播到它。
-
Qt::FocusPolicy focusPolicy() const
-
void setFocusPolicy(Qt::FocusPolicy policy)
-
10)、inputMethodHints : Qt::InputMethodHints 小部件有哪些特定于输入法的提示
只与输入小部件相关。输入法使用它来检索关于输入法如何操作的提示。例如,如果设置了Qt::ImhFormattedNumbersOnly标志,则输入方法可能会更改其可视组件,以反映只能输入数字。
警告:一些小部件需要特定的标志才能正常工作。设置一个标志,用w->setinputmethodhint(w->inputmethodhint ()|f)
代替 w->setinputmethodhint (f)
注意:这些标记只是提示,所以特定的输入法实现可以忽略它们。如果希望确保输入了某种类型的字符,还应该在小部件上设置QValidator
-
Qt::InputMethodHints inputMethodHints() const
-
void setInputMethodHints(Qt::InputMethodHints hints)
-
11)、mouseTracking : bool 是否为小部件启用鼠标跟踪
如果禁用鼠标跟踪(默认),则小部件只在鼠标移动时至少按下一个鼠标按钮时接收鼠标移动事件。 如果启用了鼠标跟踪,即使没有按下按钮,小部件也会接收鼠标移动事件。
-
bool hasMouseTracking() const
-
void setMouseTracking(bool enable)
-
12)、tabletTracking : bool 是否为小部件启用平板电脑跟踪
如果禁用了数位板跟踪(默认设置),则在移动笔时,小部件仅在手写笔与数位板接触或按下至少一个笔按钮时接收数位板移动事件。 如果启用了数位板跟踪,则即使将鼠标悬停在附近,小部件也会接收数位板移动事件。这对于监视位置以及辅助属性(例如旋转和倾斜)以及在UI中提供反馈很有用。
-
bool hasTabletTracking() const
-
void setTabletTracking(bool enable)
-
13)、acceptDrops : bool 是否为此小部件启用了drop事件
将此属性设置为true将向系统宣告此小部件可能能够接受drop事件。 如果小部件是桌面(windowType() == Qt:: desktop),如果另一个应用程序正在使用桌面,则此操作可能失败;您可以调用acceptDrops()来测试是否发生这种情况。Access functions:
- bool acceptDrops() const
- void setAcceptDrops(bool on)
-
14)、accessibleDescription : QString 辅助技术看到的小部件的描述
小部件的可访问描述应传达小部件的功能。尽管accessibleName应该是简短明了的字符串(例如,保存),但说明应提供更多上下文,例如保存当前文档。 此属性必须本地化。
Access functions:
-
QString accessibleDescription() const
-
void setAccessibleDescription(const QString &description)
-
15)、accessibleName : QString 辅助技术看到的小部件名称
这是辅助技术(例如屏幕阅读器)用来宣布此小部件的主要名称。对于大多数窗口小部件,不需要设置此属性。例如,对于QPushButton,将使用按钮的文本。 当窗口小部件不提供任何文本时,设置此属性很重要。例如,仅包含图标的按钮需要设置此属性才能与屏幕阅读器一起使用。该名称应简短,并且与小部件传达的视觉信息等效。 此属性必须本地化。
- QString accessibleName() const
- void setAccessibleName(const QString &name)
Windows系统
- modal : const bool 默认:false 小部件是否为模态小部件
这个属性只适用于windows。模态小部件阻止所有其他窗口中的小部件获得任何输入。- bool isModal() const
- windowModality : Qt::WindowModality 哪些窗口被模式窗口小部件阻止
此属性仅适用于windows。模态窗口小部件可防止其他窗口中的窗口小部件获得输入。该属性的值控制在小部件可见时哪些窗口被阻止。在窗口可见时更改此属性无效;您必须先hide()小部件,然后再次show()。- Qt::WindowModality windowModality()
- const void setWindowModality(Qt::WindowModality windowModality)
- windowFilePath : QString 与小部件关联的文件路径
此属性仅适用于windows。它将文件路径与窗口相关联。如果您设置了文件路径,但没有设置窗口标题,Qt将窗口标题设置为指定路径的文件名,使用QFileInfo::fileName()获得。 如果在任何位置设置了窗口标题,则窗口标题优先,将显示而不是文件路径字符串。 此外,在macOS上,如果文件路径存在,还可以设置窗口的代理图标。 如果没有设置文件路径,则此属性包含一个空字符串。 默认情况下,此属性包含一个空字符串。- QString windowFilePath() const
- void setWindowFilePath(const QString &filePath)
- windowIcon : QIcon 包含小部件的图标
此属性仅对Windows有意义。如果未设置任何图标,则windowIcon()返回应用程序图标QApplication::windowIcon()。 注意:在macOS上,窗口图标代表活动文档,除非使用setFilePath设置了文件路径,否则不会显示。- QIcon windowIcon() const
- void setWindowIcon(const QIcon &icon)
顶级窗口的属性
-
windowFlags : Qt::WindowFlags 窗口系统的多个提示的组合的标志
窗口标志是一种类型(例如Qt::Dialog)和零个或多个窗口系统提示(例如Qt::FramelessWindowHint)的组合。 如果窗口小部件的类型为Qt::Widget或Qt::SubWindow并成为窗口(Qt::Window,Qt::Dialog等),则将其放置在桌面上的位置(0,0)。如果窗口小部件是一个窗口并变为Qt::Widget或Qt::SubWindow,则将其放置在相对于其父窗口小部件的位置(0,0)。 注意:更改窗口的标志时,此函数将调用setParent(),从而导致窗口小部件被隐藏。您必须调用show()才能使小部件再次可见。
- Qt::WindowFlags windowFlags() const
- void setWindowFlags(Qt::WindowFlags type)
-
windowModified : bool 窗口中显示的文档是否有未保存的更改
已修改窗口是指其内容已更改但尚未保存到磁盘的窗口。该标志会因平台的不同而产生不同的效果。 请注意,如果一个小部件被设置为modified,那么它的所有祖先也将被设置为modified。但是,如果在小部件上调用setWindowModified(false),它将不会传播到其父组件,因为父组件的其他子组件可能已经被修改。
- bool isWindowModified() const
- void setWindowModified(bool)
-
windowTitle : QString 此属性保存窗口标题(标题)
此属性仅对顶级窗口小部件(如窗口和对话框)有意义。如果未设置标题,则标题基于windowFilePath。如果都没有设置,则标题为空字符串。 如果使用windowModified机制,则窗口标题必须包含“[*]”占位符,该占位符指示应在何处显示“*”。通常,它应该出现在文件名之后(例如,“document1.txt[*]-文本编辑器”)。如果windowModified属性为false(默认值),则仅删除占位符。 在某些桌面平台(包括Windows和Unix)上,应用程序名称(来自QGuiApplication::applicationDisplayName)添加在窗口标题的末尾(如果已设置)。这是由QPA插件完成的,因此会显示给用户,但不属于windowTitle字符串。
- QString windowTitle() const
- void setWindowTitle(const QString &)
公共函数
构造析构
- QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
- virtual ~QWidget()
属性相关
- int x() const
int y() const
QPoint pos() const
void move(const QPoint &)
void move(int x, int y) - int width() const
int height() const - const QRect & geometry() const
void setGeometry(const QRect &)
void setGeometry(int x, int y, int w, int h)
QRect rect() const - QSize size() const
void resize(const QSize &)
void resize(int w, int h) - QRect frameGeometry() const
QSize frameSize() const - int maximumHeight() const
void setMaximumHeight(int maxh) - int maximumWidth() const
void setMaximumWidth(int maxw) - QSize minimumSize() const
void setMinimumSize(const QSize &) - void setMinimumSize(int minw, int minh)
int minimumHeight() const - void setMinimumHeight(int minh)
QSize maximumSize() const - void setMaximumSize(const QSize &)
void setMaximumSize(int maxw, int maxh) - int minimumWidth() const
void setMinimumWidth(int minw) - virtual QSize minimumSizeHint() const
- QSize baseSize() const
void setBaseSize(const QSize &)
void setBaseSize(int basew, int baseh) - virtual QSize sizeHint() const
- QSize sizeIncrement() const
void setSizeIncrement(const QSize &)
void setSizeIncrement(int w, int h) - QSizePolicy sizePolicy() const
void setSizePolicy(QSizePolicy)
void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical) - bool isMaximized() const
bool isMinimized() const - QRect normalGeometry() const
- QRect childrenRect() const
QRegion childrenRegion() const - bool isEnabled() const
void setEnabled(bool) - bool isFullScreen() const
- bool isActiveWindow() const
- Qt::LayoutDirection layoutDirection() const
void setLayoutDirection(Qt::LayoutDirection direction)
void unsetLayoutDirection() - bool isVisible() const
virtual void setVisible(bool visible) - qreal windowOpacity() const
void setWindowOpacity(qreal level) - bool autoFillBackground() const
void setAutoFillBackground(bool enabled) - const QPalette & palette() const
void setPalette(const QPalette &) - QString styleSheet() const
void setStyleSheet(const QString &styleSheet) - bool updatesEnabled() const
void setUpdatesEnabled(bool enable) - const QFont & font() const
void setFont(const QFont &) - QCursor cursor() const
void setCursor(const QCursor &)
void unsetCursor() - Qt::ContextMenuPolicy contextMenuPolicy() const
void setContextMenuPolicy(Qt::ContextMenuPolicy policy) - QLocale locale() const
void setLocale(const QLocale &locale)
void unsetLocale() - QString statusTip() const
void setStatusTip(const QString &) - QString toolTip() const
void setToolTip(const QString &) - int toolTipDuration() const
void setToolTipDuration(int msec) - QString whatsThis() const
void setWhatsThis(const QString &) - bool hasFocus() const
Qt::FocusPolicy focusPolicy() const
void setFocusPolicy(Qt::FocusPolicy policy) - Qt::InputMethodHints inputMethodHints() const
void setInputMethodHints(Qt::InputMethodHints hints) - bool hasMouseTracking() const
void setMouseTracking(bool enable) - bool hasTabletTracking() const
void setTabletTracking(bool enable) - bool acceptDrops() const
void setAcceptDrops(bool on) - QString accessibleDescription() const
void setAccessibleDescription(const QString &description) - QString accessibleName() const
void setAccessibleName(const QString &name) - bool isModal() const
Qt::WindowModality windowModality() const
void setWindowModality(Qt::WindowModality windowModality) - QString windowFilePath() const
void setWindowFilePath(const QString &filePath) - Qt::WindowFlags windowFlags() const
void setWindowFlags(Qt::WindowFlags type) - QIcon windowIcon() const
void setWindowIcon(const QIcon &icon) - bool isWindowModified() const
void setWindowModified(bool) - QString windowTitle() const
void setWindowTitle(const QString &)
系统
-
bool testAttribute(Qt::WidgetAttribute attribute) const
void setAttribute(Qt::WidgetAttribute attribute, bool on = true) -
void stackUnder(QWidget *w)
-
QBackingStore * backingStore() const 返回此小部件将被绘制到的QBackingStore
-
QScreen * screen() const 返回窗口小部件所在的屏幕
-
void setupUi(QWidget *widget) 设置指定窗口小部件的用户界面
注意:此功能可用于从使用uic创建的用户界面描述派生的小部件。
另请参阅在应用程序中使用Designer UI文件。 -
QWindow * windowHandle() const 如果是本机窗口小部件,则返回关联的QWindow,否则返回null
本机窗口小部件包括顶级窗口小部件,QGLWidget和在其上调用了WinId( )的子窗口小部件。
此功能在Qt 5.0中引入。
另请参见winId( )和screen( )。 -
WId winId() const 返回窗口小部件的窗口系统标识符
原则上是可移植的,但是如果您使用它,可能会做一些不可移植的事情。 小心。
如果小部件是非本地(外来的)并且在其上调用了winId( ),则将为该小部件提供本机句柄。
该值可能会在运行时更改。 窗口系统标识符更改后,类型为QEvent::WinIdChange的事件将发送到窗口小部件。
另请参见find( )。
内容
-
QRegion visibleRegion() const
-
void repaint(int x, int y, int w, int h)
void repaint(const QRect &rect)
void repaint(const QRegion &rgn) -
void scroll(int dx, int dy) 将小部件及其子项向右滚动dx像素,并向下滚动dy像素。 dx和dy可能为负数
滚动后,小部件将接收需要重新绘制区域的绘制事件。 对于Qt知道是不透明的小部件,这只是新暴露的部分。 例如,如果将不透明的小部件向左滚动8个像素,则只需更新右侧边缘的8个像素宽的条纹。
由于小部件默认情况下会传播其父级的内容,因此您需要设置autoFillBackground属性,或使用setAttribute( )设置Qt::WA_OpaquePaintEvent属性,以使小部件不透明。
对于使用内容传播的小部件,滚动将导致整个滚动区域的更新。
void scroll(int dx, int dy, const QRect &r) -
void update(int x, int y, int w, int h)
void update(const QRect &rect)
void update(const QRegion &rgn)
void updateGeometry()
操作
- QList<QAction *> actions() const 小部件操作的列表(可能为空)
- void addAction(QAction *action)
- void addActions(QList<QAction *> actions)
- void insertAction(QAction *before, QAction *action)
- void insertActions(QAction *before, QList<QAction *> actions)
- void removeAction(QAction *action)
顶级窗口
-
void activateWindow() 将包含此窗口小部件的顶层窗口小部件设置为活动窗口
活动窗口是具有键盘输入焦点的可见顶级窗口。 -
bool isHidden() const
-
void overrideWindowFlags(Qt::WindowFlags flags)
-
void setWindowFlag(Qt::WindowType flag, bool on = true)
-
Qt::WindowType windowType() const
-
Qt::WindowStates windowState() const 返回当前窗口状态
窗口状态是Qt::WindowState:Qt::WindowMinimized,Qt::WindowMaximized,Qt::WindowFullScreen和Qt:: WindowActive的OR组合。 -
void setWindowState(Qt::WindowStates windowState) 将窗口状态设置为windowState
窗口状态是Qt::WindowState:Qt::WindowMinimized,Qt::WindowMaximized,Qt::WindowFullScreen和Qt::WindowActive的OR组合。如果窗口不可见(即isVisible( )返回false),则窗口状态将在调用show( )时生效。对于可见窗口,更改是立即的。例如,要在全屏模式和普通模式之间切换,请使用以下代码:
w-> setWindowState(w-> windowState( )^ Qt::WindowFullScreen);
为了还原和激活最小化的窗口(同时保留其最大化和/或全屏状态),请使用以下命令:
w-> setWindowState((w-> windowState( )&〜Qt::WindowMinimized)| Qt::WindowActive);
调用此函数将隐藏小部件。您必须调用show( )才能使小部件再次可见。注意:在某些窗口系统上,Qt::WindowActive不是即时的,在某些情况下可以忽略。当窗口状态更改时,窗口小部件会收到QEvent::WindowStateChange类型的changeEvent( )。
-
QWidget * window() const 返回此窗口小部件的窗口
即具有(或可能具有)窗口系统框架的下一个祖先窗口小部件。
如果窗口小部件是窗口,则返回窗口小部件本身。
典型用法是更改窗口标题:
aWidget-> window( )-> setWindowTitle(“ New Window Title”);
另请参见isWindow( )。
观感
- QPalette::ColorRole backgroundRole() const
void setBackgroundRole(QPalette::ColorRole role) - QPalette::ColorRole foregroundRole() const
void setForegroundRole(QPalette::ColorRole role) - QStyle * style() const
void setStyle(QStyle *style) - QFontInfo fontInfo() const
- QFontMetrics fontMetrics() const
- void ensurePolished() const
- QString windowRole() const Only X11
- void setWindowRole(const QString &role) Only X11
捕获和渲染
- QPixmap grab(const QRect &rectangle = QRect(QPoint(0, 0), QSize(-1, -1)))
- void render(QPaintDevice *target, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren))
- void render(QPainter *painter, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren))
图像特效
- QGraphicsEffect * graphicsEffect() const
- QGraphicsProxyWidget * graphicsProxyWidget() const
- void setGraphicsEffect(QGraphicsEffect *effect)
蒙版
- void clearMask()
- QRegion mask() const
- void setMask(const QBitmap &bitmap)
- void setMask(const QRegion ®ion)
层次关系
- QWidget * childAt(int x, int y) const
QWidget * childAt(const QPoint &p) const - QWidget * parentWidget() const
void setParent(QWidget *parent)
void setParent(QWidget *parent, Qt::WindowFlags f) - QWidget * nativeParentWidget() const
- WId effectiveWinId() const
- bool isAncestorOf(const QWidget *child) const
光标
- void grabMouse()
void grabMouse(const QCursor &cursor) - void releaseMouse()
- bool underMouse() const
焦点事件
- void clearFocus()
- QWidget * focusProxy() const
void setFocusProxy(QWidget *w) - QWidget * focusWidget() const
- void setFocus(Qt::FocusReason reason)
- QWidget * nextInFocusChain() const
- QWidget * previousInFocusChain() const
- void grabKeyboard()
- void releaseKeyboard() Only Embedded Linux
- bool hasEditFocus() const
void setEditFocus(bool enable)
快捷方式
- int grabShortcut(const QKeySequence &key, Qt::ShortcutContext context = Qt::WindowShortcut)
- void releaseShortcut(int id)
- void setShortcutAutoRepeat(int id, bool enable = true)
- void setShortcutEnabled(int id, bool enable = true)
输入法
- virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const
手势
- void grabGesture(Qt::GestureType gesture, Qt::GestureFlags flags = Qt::GestureFlags())
- void ungrabGesture(Qt::GestureType gesture)
模式
- bool isEnabledTo(const QWidget *ancestor) const
- bool isVisibleTo(const QWidget *ancestor) const
- bool isWindow() const
布局
- QLayout * layout() const
void setLayout(QLayout *layout)
几何保存和恢复
- bool restoreGeometry(const QByteArray &geometry)
- QByteArray saveGeometry() const
布局大小
- void adjustSize() 调整小部件的大小以适合其内容
如果有效,则此函数使用sizeHint( ),即大小提示的宽度和高度> =0。否则,它将大小设置为覆盖所有子小部件的子矩形(所有子小部件矩形的并集)。
对于Windows,还应考虑屏幕尺寸。 如果sizeHint( )小于(200,100)并且大小策略正在扩展,则窗口将至少为(200,100)。 窗口的最大大小是屏幕宽度和高度的2/3。
另请参见sizeHint( )和childrenRect( )。 - void setFixedSize(const QSize &s)
- void setFixedSize(int w, int h)
- void setFixedHeight(int h)
- void setFixedWidth(int w)
- virtual bool hasHeightForWidth() const
- virtual int heightForWidth(int w) const
旁白和内容大小
- QMargins contentsMargins() const
void setContentsMargins(int left, int top, int right, int bottom)
void setContentsMargins(const QMargins &margins) - QRect contentsRect() const
相对位置
- QPoint mapFrom(const QWidget *parent, const QPoint &pos) const
- QPoint mapFromGlobal(const QPoint &pos) const
- QPoint mapFromParent(const QPoint &pos) const
- QPoint mapTo(const QWidget *parent, const QPoint &pos) const
- QPoint mapToGlobal(const QPoint &pos) const
- QPoint mapToParent(const QPoint &pos) const
重新实现的功能函数
- paintEngine() const override : virtual QPaintEngine *
重新实现:QPaintDevice::paintEngine() 常量。
返回小部件的绘制引擎。
请注意,此函数不应由用户显式调用,因为它仅用于重新实现。 该函数由Qt内部调用,默认实现可能并不总是返回有效的指针。
槽函数
-
close() : bool 关闭此小部件
首先,它向小部件发送QCloseEvent。 如果小部件接受关闭事件,则将其隐藏。 如果它忽略该事件,则什么也不会发生。 QWidget::closeEvent() 的默认实现接受close事件。如果该小部件具有Qt::WA_DeleteOnClose标志,则该小部件也将被删除。 无论小部件是否可见,关闭事件都会传递给小部件。
关闭最后一个设置了Qt::WA_QuitOnClose属性的可见主窗口(即没有父窗口) 时,将发出QApplication::lastWindowClosed() 信号。 默认情况下,为所有窗口小部件设置此属性,瞬态窗口(例如初始屏幕,工具窗口和弹出菜单) 除外。
-
hide() : void 隐藏小部件
此函数等效于setVisible(false) 。
注意:如果您正在使用QDialog或其子类,并且在此函数之后调用show() 函数,则对话框将以其原始位置显示。 -
lower() : void 将小部件降低到父小部件堆栈的底部
在此调用之后,小部件将在视觉上位于任何重叠的同级小部件之后(并因此而被其遮盖) 。
另请参见raise() 和stackUnder() 。 -
raise() : void 将此小部件提升到父小部件堆栈的顶部
在此调用之后,该小部件将在视觉上位于任何重叠的同级小部件之前。
注意:使用activateWindow() 时,可以调用此函数以确保窗口堆叠在顶部。
另请参见lower() 和stackUnder() 。 -
repaint() : void 除非立即禁用更新或隐藏小部件,否则立即通过调用paintEvent() 直接重绘小部件
建议仅在需要立即重绘(例如在动画期间) 时才使用repaint() 。 在几乎所有情况下,update() 都更好,因为它允许Qt优化速度并最小化闪烁。
警告:如果您在本身可以从paintEvent() 调用的函数中调用repaint() ,则可能会得到无限递归。 update() 函数永远不会导致递归。
-
setDisabled(bool disable) : void 是否启用输入事件
有关更多信息,请参见已启用的文档。 -
setEnabled(bool) : void
enabled 属性 -
setFocus() : void
如果此窗口小部件或其父级之一是活动窗口,则将键盘输入焦点赋予该窗口小部件(或其焦点代理) 。 -
setHidden(bool hidden) : void
便利函数,等效于setVisible(!hidden) 。
另请参见isHidden() 。 -
setStyleSheet(const QString &styleSheet) : void
styleSheet 属性 -
setVisible(bool visible) : virtual void
visible 属性 -
setWindowModified(bool) : void
windowModified 属性 -
setWindowTitle(const QString &) : void
windowTitle 属性 -
show() : void 显示窗口小部件及其子窗口小部件
这等效于调用showFullScreen() ,showMaximized() 或setVisible(true) ,具体取决于平台对窗口标志的默认行为。 -
showFullScreen() : void 以全屏模式显示小部件
此函数仅在Windows有效。 要从全屏模式返回,请调用showNormal() 。
全屏模式在Windows下可以正常工作,但在X下可以解决某些问题。这些问题是由于ICCCM协议的限制所致,该协议指定了X11客户端与窗口管理器之间的通信。 ICCCM根本不了解非装饰全屏窗口的概念。因此,我们能做的最好的就是请求一个无边界的窗口,并放置它并调整其大小以填充整个屏幕。根据窗口管理器的不同,此方法可能有效也可能无效。使用MOTIF提示请求无边界窗口,几乎所有现代窗口管理器都至少部分支持该提示。
另一种选择是完全绕开窗口管理器,并使用Qt::X11BypassWindowManagerHint标志创建一个窗口。但是,这还有其他严重的问题,例如键盘焦点完全损坏以及对桌面更改或用户抬起其他窗口时产生非常奇怪的影响。
遵循最新的ICCCM后规范的X11窗口管理器正确支持全屏模式。
-
showMaximized() : void 显示最大化的小部件
此函数仅在Windows有效。 在X11上,此功能可能不适用于某些窗口管理器。 有关说明,请参见“窗口几何”文档。 -
showMinimized() : void 将最小化的小部件显示为图标
此函数仅在Windows有效。 -
showNormal() : void 在最大化或最小化窗口小部件后还原它
此函数仅在Windows有效。 -
update() : void 除非禁用更新或隐藏小部件,否则更新小部件
此功能不会立即重绘; 相反,当Qt返回到主事件循环时,它将安排一个绘画事件进行处理。 与对repaint() 的调用相比,这允许Qt优化以提高速度和减少闪烁。 多次调用update() 通常只会导致一次paintEvent() 调用。
Qt通常在paintEvent() 调用之前擦除小部件的区域。 如果设置了Qt::WA_OpaquePaintEvent小部件属性,则该小部件负责用不透明的颜色绘制其所有像素。
信号
- void customContextMenuRequested(const QPoint &pos)当小部件的contextMenuPolicy为Qt::CustomContextMenu且用户已请求小部件上的上下文菜单时,将发出此信号。 位置pos是窗口小部件接收的上下文菜单事件的位置。 通常这是在小部件坐标中。 该规则的例外是QAbstractScrollArea及其子类,这些子类将上下文菜单事件映射到viewport() 的坐标。
另请参见mapToGlobal() ,QMenu和contextMenuPolicy。 - void windowIconChanged(const QIcon &icon)当窗口的图标更改时,以新图标作为参数,将发出此信号。
注意:属性windowIcon的通知程序信号。 - void windowTitleChanged(const QString &title)当窗口标题更改时,以新标题作为参数,将发出此信号。
注意:属性windowTitle的通知程序信号。
此功能在Qt 5.2中引入。
静态公用函数
-
QWidget * createWindowContainer(QWindow *window, QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()) 创建一个QWidget,可以将窗口嵌入到基于QWidget的应用程序中
窗口容器被创建为父级的子级,并带有窗口标志标志。
将窗口嵌入容器后,容器将控制窗口的几何形状和可见性。不建议在嵌入式窗口上显式调用QWindow::setGeometry() ,QWindow::show() 或QWindow::hide() 。
容器接管了窗口的所有权。可以通过调用QWindow::setParent() 从窗口容器中删除该窗口。
窗口容器作为本机子窗口附加到其子级的顶层窗口。当窗口容器用作QAbstractScrollArea或QMdiArea的子级时,它将为其父链中的每个小部件创建一个本机窗口,以便在此用例中进行适当的堆叠和剪切。为窗口容器创建本机窗口还可以进行正确的堆栈和剪切。必须在显示窗口容器之前完成此操作。具有许多本机子窗口的应用程序可能会遇到性能问题。
窗口容器有许多已知的限制:
- 堆叠顺序;嵌入式窗口将作为不透明框堆叠在小部件层次结构的顶部。多个重叠的窗口容器实例的堆叠顺序是不确定的。
- 渲染集成;窗口容器不能与QGraphicsProxyWidget,QWidget::render() 或类似功能互操作。
- 焦点处理;可以让窗口容器实例具有任何焦点策略,并且它将通过调用QWindow::requestActivate() 将焦点委托给窗口。但是,从QWindow实例返回正常的焦点链将取决于QWindow实例实现本身。例如,当进入带有标签页焦点的基于Qt Quick的窗口时,很有可能进一步的标签页按下只会在QML应用程序内部循环。同样,QWindow::requestActivate() 是否真正赋予窗口焦点取决于平台。
- 在基于QWidget的应用程序中使用许多窗口容器实例可能会严重损害应用程序的整体性能。
-
QWidget * find(WId id) 返回带有窗口标识符/句柄ID的小部件的指针
窗口标识符的类型取决于基础窗口系统,有关实际定义,请参见qwindowdefs.h。 如果没有带有此标识符的窗口小部件,则返回nullptr。 -
- QWidget * keyboardGrabber() : 返回当前正在获取键盘输入的小部件
如果此应用程序中当前没有任何小部件在抓住键盘,则返回nullptr。
另请参见grabMouse() 和mouseGrabber() 。
- QWidget * keyboardGrabber() : 返回当前正在获取键盘输入的小部件
-
- QWidget * mouseGrabber() : 返回当前正在捕获鼠标输入的小部件
如果此应用程序中当前没有任何小部件在抓住鼠标,则返回nullptr。
另请参见grabMouse() 和keyboardGrabber() 。"
- QWidget * mouseGrabber() : 返回当前正在捕获鼠标输入的小部件
-
- void setTabOrder(QWidget *first, QWidget *second) : 在焦点顺序中将第二个小部件放在第一个小部件之后
它有效地从焦点链中删除了第二个小部件,并将其插入第一个小部件之后。
请注意,由于第二个窗口小部件的制表符顺序已更改,因此您应按以下顺序排序链:
setTabOrder(a,b) ; //从a到b setTabOrder(b,c) ; //从a到b到c setTabOrder(c,d) ; //从a到b到c到d
不像这样:
//错误 setTabOrder(c,d) ; // c到d setTabOrder(a,b) ; // a到b AND c到d setTabOrder(b,c) ; //从a到b到c,但不从c到d
如果第一个或第二个具有焦点代理,则setTabOrder() 可以正确替代代理。
注意:从Qt 5.10开始:具有子级作为焦点代理的窗口小部件被理解为复合窗口小部件。在一个或两个复合小部件之间设置标签顺序时,将保留每个标签内部的本地标签顺序。这意味着,如果两个窗口小部件都是复合窗口小部件,则产生的选项卡顺序将是从第一个内部的最后一个子项到第二个内部的第一个子项。
另请参见小部件中的setFocusPolicy() ,setFocusProxy() 和“键盘焦点”。 - void setTabOrder(QWidget *first, QWidget *second) : 在焦点顺序中将第二个小部件放在第一个小部件之后
受保护函数
- virtual void actionEvent(QActionEvent *event) :
每当更改窗口小部件的动作时,都会使用给定事件调用此事件处理程序。See also addAction(), insertAction(), removeAction(), actions(), and QActionEvent. - virtual void changeEvent(QEvent *event) :
可以重新实现此事件处理程序以处理状态更改。
可以通过提供的事件来检索在此事件中更改的状态。
更改事件包括:QEvent::ToolBarChange,QEvent::ActivationChange,QEvent::EnabledChange,QEvent::FontChange,QEvent::StyleChange,QEvent::PaletteChange,QEvent::WindowTitleChange,QEvent::IconTextChange,QEvent::ModifiedChange,QEvent::MouseTrackingChange,QEvent::ParentChange,QEvent::WindowStateChange,QEvent::LanguageChange,QEvent::LocaleChange,QEvent::LayoutDirectionChange,QEvent::ReadOnlyChange。 - virtual void closeEvent(QCloseEvent *event) :
当Qt从窗口系统收到对顶级窗口小部件的窗口关闭请求时,将使用给定事件调用此事件处理程序。
默认情况下,事件被接受并且小部件关闭。 您可以重新实现此功能,以更改小部件响应窗口关闭请求的方式。 例如,可以通过在所有事件上调用ignore() 来防止窗口关闭。
主窗口应用程序通常使用此功能的重新实现来检查用户的工作是否已保存并在关闭前请求许可。 例如,应用程序示例使用帮助器函数来确定是否关闭窗口:
另请参见event() ,hide() ,close() ,QCloseEvent和应用程序示例。 - virtual void contextMenuEvent(QContextMenuEvent *event) :
对于事件事件,可以在子类中重新实现此事件处理程序,以接收小部件上下文菜单事件。
当小部件的contextMenuPolicy为Qt::DefaultContextMenu时,将调用处理程序。
默认实现忽略上下文事件。 有关更多详细信息,请参见QContextMenuEvent文档。
另请参见event() ,QContextMenuEvent和customContextMenuRequested() 。 - void create(WId window = 0, bool initializeWindow = true, bool destroyOldWindow = true) :
创建一个新的窗口小部件窗口。
Qt 5中会忽略参数window,initializeWindow和destroyOldWindow。请使用QWindow::fromWinId() 创建一个包装外部窗口的QWindow,并将其传递给QWidget::createWindowContainer() 。
另请参见createWindowContainer() 和QWindow::fromWinId() 。 - void destroy(bool destroyWindow = true, bool destroySubWindows = true) : 释放窗口系统资源
如果destroyWindow为true,则销毁窗口小部件窗口。
destroy() 递归地为所有子小部件调用自身,将destroySubWindows传递给destroyWindow参数。 要更好地控制子小部件的销毁,请首先有选择地销毁子小部件。
通常从QWidget析构函数调用此函数。 - virtual void dragEnterEvent(QDragEnterEvent *event) :
当拖动正在进行并且鼠标进入此小部件时,将调用此事件处理程序。 该事件在event参数中传递。
如果事件被忽略,则小部件将不会收到任何拖动事件。
有关如何在应用程序中进行拖放的概述,请参见拖放文档。
另请参见QDrag和QDragEnterEvent。 - virtual void dragLeaveEvent(QDragLeaveEvent *event) :
当拖动正在进行并且鼠标离开该小部件时,将调用此事件处理程序。 该事件在event参数中传递。
有关如何在应用程序中进行拖放的概述,请参见拖放文档。
另请参见QDrag和QDragLeaveEvent。 - virtual void dragMoveEvent(QDragMoveEvent *event) :
如果正在进行拖动,并且发生以下任何一种情况,则将调用此事件处理程序:光标进入此窗口小部件,光标在该窗口小部件内移动,或者在该窗口小部件获得焦点时按下键盘上的修改键。 该事件在event参数中传递。
有关如何在应用程序中进行拖放的概述,请参见拖放文档。
另请参见QDrag和QDragMoveEvent。 - virtual void dropEvent(QDropEvent *event) :
当拖动拖放到此小部件上时,将调用此事件处理程序。 该事件在event参数中传递。
有关如何在应用程序中进行拖放的概述,请参见拖放文档。
另请参见QDrag和QDropEvent。 - virtual void enterEvent(QEvent *event) :
可以在子类中重新实现此事件处理程序,以接收在事件参数中传递的小部件输入事件。
当鼠标光标进入窗口小部件时,事件将发送到窗口小部件。
另请参见leaveEvent() ,mouseMoveEvent() 和event() 。 - virtual void focusInEvent(QFocusEvent *event) :
可以在子类中重新实现此事件处理程序,以接收小部件的键盘焦点事件(接收到的焦点) 。 该事件在event参数中传递
小部件通常必须将FocusPolicy() 设置为Qt::NoFocus以外的其他值,才能接收焦点事件。 (请注意,应用程序程序员可以在任何小部件上调用setFocus() ,即使那些通常不接受焦点的小部件也是如此。)
默认实现会更新窗口小部件(未指定focusPolicy() 的窗口除外) 。
另请参见focusOutEvent() ,setFocusPolicy() ,keyPressEvent() ,keyReleaseEvent() ,event() 和QFocusEvent。 - bool focusNextChild() :
查找一个新的窗口小部件,以使键盘焦点适合于Tab,并在可以找到新窗口小部件的情况下返回true,否则将返回false。
另请参见focusPreviousChild() 。 - virtual bool focusNextPrevChild(bool next) :
根据Tab和Shift + Tab键,找到一个使键盘焦点对准的新小部件,如果可以找到新的小部件,则返回true;否则,返回false。
如果next为true,则此函数向前搜索;如果next为false,则向后搜索。
有时,您将需要重新实现此功能。 例如,Web浏览器可能会重新实现它,以使其“当前活动链接”向前或向后移动,并仅在到达“页面”上的最后一个或第一个链接时才调用focusNextPrevChild() 。
子窗口小部件在其父窗口小部件上调用focusNextPrevChild() ,但是只有包含子窗口小部件的窗口才决定将焦点重定向到何处。 通过为对象重新实现此功能,可以控制所有子小部件的焦点遍历。
另请参见focusNextChild() 和focusPreviousChild() 。 - virtual void focusOutEvent(QFocusEvent *event) :
可以在子类中重新实现此事件处理程序,以接收小部件的键盘焦点事件(焦点丢失) 。 事件在event参数中传递。
小部件通常必须将FocusPolicy() 设置为Qt::NoFocus以外的其他值,才能接收焦点事件。 (请注意,应用程序程序员可以在任何小部件上调用setFocus() ,即使那些通常不接受焦点的小部件也是如此。)
默认实现会更新窗口小部件(未指定focusPolicy() 的窗口除外) 。
另请参见focusInEvent() ,setFocusPolicy() ,keyPressEvent() ,keyReleaseEvent() ,event() 和QFocusEvent。 - bool focusPreviousChild() :
根据Shift + Tab键,找到一个将键盘焦点对准的新小部件,如果可以找到新的小部件,则返回true;否则,返回false。
另请参见focusNextChild() 。 - virtual void hideEvent(QHideEvent *event) :
可以在子类中重新实现此事件处理程序,以接收小部件隐藏事件。 该事件在event参数中传递。
隐藏事件在隐藏后会立即发送到小部件。
注意:当窗口系统更改其映射状态时,例如窗口小部件,窗口小部件会收到自发的显示和隐藏事件。 当用户最小化窗口时,将发生自发的隐藏事件;当再次恢复窗口时,将发生自发的显示事件。 收到自发的hide事件后,从isVisible() 的角度来看,仍认为小部件可见。
另请参见visible,event() 和QHideEvent。 - virtual void inputMethodEvent(QInputMethodEvent *event) :
可以在子类中重新实现此事件处理程序(用于事件事件) ,以接收输入法合成事件。 输入方法的状态更改时,将调用此处理程序。
请注意,在创建自定义文本编辑窗口小部件时,必须显式设置Qt::WA_InputMethodEnabled窗口属性(使用setAttribute() 函数) ,以便接收输入法事件。
默认实现调用event-> ignore() ,它拒绝Input Method事件。 有关更多详细信息,请参见QInputMethodEvent文档。
另请参见event() 和QInputMethodEvent。 - virtual void keyPressEvent(QKeyEvent *event) :
可以在子类中重新实现此事件处理程序(用于事件事件) ,以接收小部件的按键事件。
小部件必须调用setFocusPolicy() 才能最初接受焦点并具有焦点,以便接收按键事件。
如果重新实现此处理程序,那么如果不对键进行操作,则调用基类实现非常重要。
如果用户按下QKeySequence::Cancel的键序列(通常是Escape键) ,则默认实现将关闭弹出窗口小部件。 否则,事件将被忽略,以便小部件的父级可以解释它。
请注意,QKeyEvent以isAccepted() == true开头,因此您无需调用QKeyEvent::accept() -如果对键进行操作,则无需调用基类实现。
另请参见keyReleaseEvent() ,setFocusPolicy() ,focusInEvent() ,focusOutEvent() ,event() ,QKeyEvent和Tetrix示例。 - virtual void keyReleaseEvent(QKeyEvent *event) :
可以在子类中重新实现此事件处理程序(用于事件事件) ,以接收小部件的关键释放事件。
小部件必须首先接受焦点并具有焦点才能接收按键释放事件。
如果重新实现此处理程序,那么如果不对键进行操作,则调用基类实现非常重要。
默认实现忽略该事件,以便小部件的父级可以解释该事件。
请注意,QKeyEvent以isAccepted() == true开头,因此您无需调用QKeyEvent::accept() -如果对键进行操作,则无需调用基类实现。
另请参见keyPressEvent() ,QEvent::ignore() ,setFocusPolicy() ,focusInEvent() ,focusOutEvent() ,event() 和QKeyEvent。 - virtual void leaveEvent(QEvent *event) :
可以在子类中重新实现此事件处理程序,以接收在event参数中传递的小部件离开事件。
当鼠标光标离开小部件时,将离开事件发送到该小部件。
另请参见enterEvent() ,mouseMoveEvent() 和event() 。 - virtual void mouseDoubleClickEvent(QMouseEvent *event) :
可以在子类中重新实现此事件处理程序(用于事件事件) ,以接收小部件的鼠标双击事件。
默认实现调用mousePressEvent() 。
注意:除了双击事件外,小部件还将接收鼠标按下和鼠标释放事件。 并且如果另一个与该小部件重叠的小部件因响应按下或释放事件而消失,则该小部件将仅收到双击事件。 开发人员应确保应用程序正确解释这些事件。
另请参见mousePressEvent() ,mouseReleaseEvent() ,mouseMoveEvent() ,event() 和QMouseEvent。 - virtual void mouseMoveEvent(QMouseEvent *event) :
可以在子类中重新实现事件事件的事件处理程序,以接收小部件的鼠标移动事件。
如果关闭了鼠标跟踪,则只有在移动鼠标时按下鼠标按钮才会发生鼠标移动事件。如果打开了鼠标跟踪,则即使没有按下鼠标按钮也会发生鼠标移动事件。
QMouseEvent::pos() 报告鼠标光标相对于此小部件的位置。对于按下和释放事件,其位置通常与上次鼠标移动事件的位置相同,但是如果用户握手则可能会有所不同。这是基础窗口系统的功能,而不是Qt。
如果要在鼠标移动时立即显示工具提示(例如,使用QMouseEvent::pos() 获取鼠标坐标并将其显示为工具提示) ,则必须首先如上所述启用鼠标跟踪。然后,为确保立即更新工具提示,必须在实现mouseMoveEvent() 时调用QToolTip::showText() 而不是setToolTip() 。
另请参见setMouseTracking() ,mousePressEvent() ,mouseReleaseEvent() ,mouseDoubleClickEvent() ,event() ,QMouseEvent和Scribble示例。 - virtual void mousePressEvent(QMouseEvent *event) :
可以在子类中重新实现此事件处理程序(用于事件事件) ,以接收小部件的鼠标按下事件。
如果您在mousePressEvent() 中创建新的小部件,则mouseReleaseEvent() 可能不会在您期望的位置结束,具体取决于基础窗口系统(或X11窗口管理器) ,小部件的位置,甚至更多。
当您在窗口外部单击时,默认实现会关闭弹出窗口小部件。 对于其他窗口小部件类型,它不执行任何操作。
另请参见mouseReleaseEvent() ,mouseDoubleClickEvent() ,mouseMoveEvent() ,event() ,QMouseEvent和Scribble示例。 - virtual void mouseReleaseEvent(QMouseEvent *event) :
可以在子类中重新实现此事件处理程序(用于事件事件) ,以接收小部件的鼠标释放事件。
另请参见mousePressEvent() ,mouseDoubleClickEvent() ,mouseMoveEvent() ,event() ,QMouseEvent和Scribble示例。 - virtual void moveEvent(QMoveEvent *event) :
可以在子类中重新实现此事件处理程序,以接收在event参数中传递的小部件移动事件。 当窗口小部件接收到此事件时,它已经处于新位置。
可以通过QMoveEvent::oldPos() 访问旧职位。
另请参见resizeEvent() ,event() ,move() 和QMoveEvent。 - virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result) :
可以在子类中重新实现此特殊事件处理程序,以接收由eventType标识的本机平台事件,这些事件在message参数中传递。
在重新实现此功能时,如果要停止由Qt处理的事件,请返回true并设置结果。 结果参数仅在Windows上具有含义。 如果返回false,则将本机事件传递回Qt,Qt将事件转换为Qt事件并将其发送到小部件。
注意:仅当窗口小部件具有本机窗口句柄时,事件才会传递到此事件处理程序。
注意:此函数取代Qt 4的事件过滤器函数x11Event() ,winEvent() 和macEvent() 。
另请参见QAbstractNativeEventFilter。 - virtual void paintEvent(QPaintEvent *event) : 子类重新实现此事件处理程序,以接收事件中传递的绘画事件
绘制事件是重新绘制小部件的全部或一部分的请求。可能由于以下原因之一而发生:
调用了repaint() 或update()
该小部件已被遮盖,现在已被发现
或者许多其他原因。
许多窗口小部件可以在需要时仅重绘整个表面,但是一些慢速窗口小部件需要通过仅绘制请求的区域来优化:QPaintEvent::region() 。此速度优化不会更改结果,因为在事件处理期间将绘画裁剪到该区域。例如,QListView和QTableView就是这样做的。
Qt还尝试通过将多个绘画事件合并为一个来加快绘画速度。当多次调用update() 或窗口系统发送多个绘制事件时,Qt会将这些事件合并为一个具有较大区域的事件(请参见QRegion::united() ) 。 repaint() 函数不允许这种优化,因此我们建议尽可能使用update() 。
发生绘画事件时,通常会擦除更新区域,因此您正在小部件的背景上绘画。
可以使用setBackgroundRole() 和setPalette() 设置背景。
从Qt 4.0开始,QWidget自动对其绘画进行双缓冲,因此无需在paintEvent() 中编写双缓冲代码来避免闪烁。
注意:通常,应避免在paintEvent() 内部调用update() 或repaint() 。例如,在paintEvent() 内的子级上调用update() 或repaint() 会导致未定义的行为。孩子可能会也可能不会参加绘画活动。
警告:如果您使用的自定义绘画引擎没有Qt的后备存储,则必须设置Qt::WA_PaintOnScreen。否则,QWidget::paintEngine() 将永远不会被调用;将使用后备存储。
另请参见event() ,repaint() ,update() ,QPainter,QPixmap,QPaintEvent和Analog Clock Example。 - virtual void resizeEvent(QResizeEvent *event) :
可以在子类中重新实现此事件处理程序,以接收在事件参数中传递的窗口小部件调整大小事件。 调用resizeEvent() 时,小部件已经具有其新的几何形状。 可以通过QResizeEvent::oldSize() 访问旧大小。
在处理调整大小事件后,该窗口小部件将被擦除并立即收到一个绘制事件。 在此处理程序内无需(或不应) 进行绘制。
另请参见moveEvent() ,event() ,resize() ,QResizeEvent,paintEvent() 和Scribble示例。 - virtual void showEvent(QShowEvent *event) :
可以在子类中重新实现此事件处理程序,以接收在event参数中传递的窗口小部件显示事件。
非自发的显示事件会在显示之前立即发送到窗口小部件。 窗口的自发显示事件随后被传送。
注意:当窗口系统更改其映射状态时,例如窗口小部件,窗口小部件会收到自发的显示和隐藏事件。 当用户最小化窗口时,将发生自发的隐藏事件;当再次恢复窗口时,将发生自发的显示事件。 收到自发的hide事件后,从isVisible() 的角度来看,仍认为小部件可见。
另请参见visible,event() 和QShowEvent。 - virtual void tabletEvent(QTabletEvent *event) :
可以在子类中重新实现用于事件event的处理程序,以接收该小部件的手写板事件。
如果重新实现此处理程序,则不处理该事件就必须忽略() 事件,以便小部件的父级可以解释该事件,这一点非常重要。
默认实现忽略该事件。
如果关闭了数位板跟踪功能,则只有在手写笔与数位板接触或在移动手写笔时按下至少一个手写笔按钮时,才会发生数位板移动事件。 如果打开了数位板跟踪功能,则即使手写笔在数位板附近徘徊而没有按下按钮,也将发生数位板移动事件。
另请参见QEvent::ignore() ,QEvent::accept() ,event() ,setTabletTracking() 和QTabletEvent。 - virtual void wheelEvent(QWheelEvent *event) :
可以在子类中重新实现此事件处理程序(用于事件事件) ,以接收小部件的转轮事件。
如果重新实现此处理程序,则不处理该事件就必须忽略() 事件,以便小部件的父级可以解释该事件,这一点非常重要。
默认实现忽略该事件。
另请参见QEvent::ignore() ,QEvent::accept() ,event() 和QWheelEvent。
重写的受保护函数
- virtual bool event(QEvent *event) override : 重新实现:QObject::event(QEvent * e)
这是主事件处理程序;它处理事件事件。您可以在子类中重新实现此函数,但是我们建议改用一种专用的事件处理程序。
按键和释放事件与其他事件的处理方式有所不同。 event() 检查Tab和Shift + Tab并尝试适当地移动焦点。如果没有将焦点移至的小部件(或者按键不是Tab或Shift + Tab) ,则event() 会调用keyPressEvent() 。
鼠标和平板电脑的事件处理也有些特殊:仅当启用小部件时,event() 才会调用专门的处理程序,例如mousePressEvent() ;。否则将丢弃该事件。
如果事件被识别,则此函数返回true,否则返回false。如果识别的事件被接受(请参见QEvent::accepted) ,则任何进一步的处理(例如,事件传播到父窗口小部件) 都将停止。
另请参见closeEvent() ,focusInEvent() ,focusOutEvent() ,enterEvent() ,keyPressEvent() ,keyReleaseEvent() ,leaveEvent() ,mouseDoubleClickEvent() ,mouseMoveEvent() ,mousePressEvent() ,mouseReleaseEvent() ,moveEvent() , paintEvent() ,resizeEvent() ,QObject::event() 和QObject::timerEvent() 。 - virtual void initPainter(QPainter *painter) const override :
将绘画笔,背景和字体初始化为与给定小部件相同的颜色。 在QWidget上打开画家时,将自动调用此函数。 - virtual int metric(QPaintDevice::PaintDeviceMetric m) const override :
重新实现:QPaintDevice::metric(QPaintDevice::PaintDeviceMetric metric) 常量。
虚拟QPaintDevice::metric() 函数的内部实现。m是要获取的指标。
受保护的槽函数
- void updateMicroFocus() :
更新小部件的微焦点。
宏定义
- QWIDGETSIZE_MAX 定义QWidget对象的最大大小
小部件允许的最大大小为QSize(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX) ,即QSize(16777215,16777215) 。
另请参见QWidget::setMaximumSize() 。
参考
- Analog Clock Example
- Shaped Clock Example
- Application Example
- Scribble Example
- Window Flags Example
- Window and Dialog Widgets
- Layout Management
- Keyboard Focus in Widgets
- Using a Designer UI File in Your Application
总结
- 顶层窗口小部件的相关设置以及相关的位置、大小等信息
- 作为容器使用,支持布局、拖放和无障碍
- 当作画板,支持双缓冲
- 支持图像特效–QGraphicsEffect,目前只有四种。