一、Qt6笔记——QWidget
- 元对象的属性系统,介绍QWidget属性。
1 QWidget详细介绍
Widget是交互界面(用户界面)的基本组成部分:Widget可以从窗口系统中接受鼠标、键盘或者其他事件,并在屏幕上绘制相应Widget界面。每个Widget都是矩形,每个Widget都是以Z轴顺序排列。Widget会被其父控件Widget和位于其前方的控件Widget剪裁(意识就是被遮挡区域就会无法显示)。
如果一个Widget没有被嵌入在父Widget里面,这个Widget就会被称作是window。窗口window还有边框frame和标题bar,但是也可以用一些window flags
创建没有装饰的窗口window。在 Qt 中,QMainWindow
和各种 QDialog
的子类是最常见的窗口类型。
每个widget的构造函数都是接受一个或者两个标准参数:
-
QWidget *parent = nullptr
这个变量是此时要创建QWidget的父构件。如果它是 nullptr(默认值),新窗口小部件将是一个窗口。如果不是,它将成为 parent 的子窗口小部件,并受到 parent 几何体的约束(除非你指定 Qt::Window 作为窗口标志)。 -
Qt::WindowFlags f = { }
(如果可用)用于设置窗口flags,默认参数适合大多数widgets,但如果你想获得一个没有窗口系统框架的窗口,则必须使用特殊的标志。
QWidget 有许多成员函数,但其中一些函数本身功能不多;例如,QWidget 有一个字体属性,但它本身从不使用这个属性。许多子类提供了真正的功能,比如 QLabel、QPushButton、QListWidget 和 QTabWidget。
1.1 Top-Level 和 child widgets
Top-Level:没有父窗口小部件的窗口小部件总是一个独立的窗口(顶级窗口小部件)。对于这些窗口小部件,setWindowTitle() 和 setWindowIcon() 分别设置标题栏和图标。
child widgets:非窗口的小部件是子窗口小部件,显示在它们的父窗口小部件内。Qt 中的大多数小部件主要作为子窗口小部件使用。例如,按钮可以作为顶级窗口显示,但大多数人更喜欢将按钮放在其他窗口小部件内。
上图展示了一个 QGroupBox 小部件,它通过 QGridLayout 布局容纳了各种子小部件。QLabel 子小部件的边框已被描绘出来,以显示它们的完整尺寸。 如果你想使用 QWidget 来容纳子小部件,通常需要为父 QWidget 添加一个布局。有关更多信息,请参见布局管理。
1.2 复合小部件Composite Widgets
当一个小部件被用作容器来组合多个子小部件时,它被称为复合小部件。这类小部件可以通过构建一个具有所需视觉属性的小部件(例如 QFrame),并将子小部件添加到其中,通常由布局管理。
复合小部件还可以通过继承标准小部件(例如 QWidget 或 QFrame)来创建,意识就是QWidget或者QFrame作为父构件,在父构件里面添加子构件,并在子类的构造函数中添加必要的布局和子小部件。Qt 提供的许多示例都使用了这种方法,并且在 Qt 小部件教程中也有介绍。
1.3 Custom Widgets and Painting
由于 QWidget 是 QPaintDevice 的子类,因此其子类可以通过使用 QPainter 类实例进行一系列绘制操作,显示自定义内容。这种方法与图形视图框架中使用的画布式方法不同,后者通过应用程序将项目添加到场景中,并由框架自行渲染。
每个小部件都从其 paintEvent() 函数中执行所有绘制操作。无论是由于外部变化还是应用程序请求,当小部件需要重绘时,都会调用该函数。