文章目录
一、界面组件概述
在 Qt 类库中,所有界面组件类的直接或间接父类都是 QWidget。QWidget 的父类是 QObject 和 QPaintDevice,所以 QWidget 是多重继承的类。QObject 支持元对象系统,其信号与槽机制为 GUI 编程中对象间通信提供了极大的便利。QPaintDevice 是能使用 QPainter 类在绘图设备上绘图的类。所有从 QWidget 继承而来的界面组件被称为 widget 组件。
- 按钮类组件。类继承关系如图所示,其中,QAbstractButton 是一个抽象类,它定义了按钮类的一些共有特性,但是不能用于创建实例对象:

QCommandLinkButton 的功能类似于 QRadioButton,用于多个互斥项的选择,例如在向导对话框中作为一组互斥选择按钮。QDialogButtonBox 是一个复合组件类,可以设置为多个按钮的组合,例如包含 OK 和 Cancel 按钮,或 Yes、No 和 Cancel 按钮,可以放在对话框上,作为对话框的选择按钮。
- 输入类组件。下图所示的是组件面板中 Input Widgets 分组的组件:

输入类组件对应的类及其功能如表所示:

- 显示类组件。下图所示的是组件面板中 Display Widgets 分组的组件,显示类组件一般只能显示内容,而不能编辑、输入内容:

Horizontal Line 和 Vertical Line 对应的类均是 QFrame,将 QFrame 类的 frameShape 属性设置为 HLine 或 VLine,并设置 frameShadow 属性为 Sunken,就具有了水平线条或垂直线条的效果,它们一般在界面上用作分隔线。界面类组件的功能如表所示:

- 容器类组件。在容器类组件上可以放置其他组件,并可以使用布局管理容器内的子组件。下图所示的是组件面板中 Containers 分组的组件:

容器类组件对应的类及其功能如表所示:

- Item 组件。下图所示的是组件面板中 Item Views 和 Item Widgets 分组的组件:

QAbstractItemView 的父类是 QAbstractScrollArea。Item Views 分组的组件用于模型/视图结构,每一种视图组件需要相应的一种模型用于存储数据。Item Widgets 组件类是相应 Item Views 组件类的子类,它们直接使用项(item)存储数据,称为相应视图类的便利类(convenience class),例如,QListWidget 是 QListView 的便利类,QTreeWidget 是 QTreeView 的便利类。
- 其他界面组件。一些界面组件并没有出现在 Qt Designer 的组件面板里,例如常用的菜单栏(QMenuBar类)、菜单(QMenu 类)、工具栏(QToolBar 类)、状态栏(QStatusBar 类)等组件,对应的几个类都是直接从QWidget继承而来的。
QWidget 是所有界面组件类的基类,所以了解 QWidget 的基本特性,通常就能了解界面组件的通用特性。 在 Qt Designer 中设计界面时,QWidget 作为界面组件时的主要属性如表所示:

组件的 sizePolicy 属性是QSizePolicy 类型,它定义了组件在水平和垂直方向的尺寸变化策略。下图展示了一个分组框中3个按钮水平布局在按钮的水平延展因子设置为不同值时的显示效果:

在第一个分组框中,3个按钮的水平延展因子都是0,表示3个按钮的宽度平均。在第二个分组框中,前两个按钮的水平延展因子都是0,Button3 的水平延展因子是1,表示分组框宽度增大时,Button1 和 Button2 达到合适宽度后就不再增大,而 Button3 占据右边所有水平区域。在第三个分组框中,3 个按钮的水平延展因子分别是 1、1、2,相当于把总宽度分成四等份,Button3 的宽度是 Button1 的2倍。
QWidget 也可以作为独立的窗口,其子类 QMainWindow、QDialog 也是常用的窗口类。QWidget 作为窗口时有一些与窗口相关的属性,具体如表所示:

当 QWidget 作为独立的窗口时,有如下一些与窗口显示有关的公有槽函数:
cpp
bool close() // 关闭窗口
void hide() // 隐藏窗口
void show() // 显示窗口
void showFullScreen() // 以全屏方式显示窗口
void showMaximized() // 窗口最大化
void showMinimized() // 窗口最小化
void showNormal() // 全屏、最大化或最小化操作之后,恢复正常大小显示
QWidget 中定义的信号只有3个,定义如下:
cpp
void customContextMenuRequested(const QPoint &pos)
void windowIconChanged(const QIcon &icon)
void windowTitleChanged(const QString &title)
其中,customContextMenuRequested() 信号是在组件上点击鼠标右键时被发射的,一般用于创建组件的快捷菜单。