容器(Containers)
容器(Containers)
(1)Group Box:组框
QGroupBox
-
继承关系:继承自 QWidget
-
功能:用于构建分组框,通常带有边框和标题栏
-
用途:作为容器部件,用于布置各种窗口部件
-
布局:建议内部使用布局控件(如 QBoxLayout)进行管理
-
键盘快捷方式:支持键盘焦点移动到组框的子部件
用法示例
-
使用 3 个 QRadioButton 单选框按钮,与QVBoxLayout(垂直布局)来展示组框的基本使用
-
新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7 #include
8
9 class MainWindow : public QMainWindow
10 {
11 Q_OBJECT
12
13 public:
14 MainWindow(QWidget parent = nullptr);
15 ~MainWindow();
16
17 private:
18 / 声明对象 */
19 QGroupBox *groupBox;
20 QVBoxLayout *vBoxLayout;
21 QRadioButton *radioButton[3];
22 };
23 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2 #include
3
4 MainWindow::MainWindow(QWidget parent)
5 : QMainWindow(parent)
6{
7 / 设置主窗体位置与大小 /
8 this->setGeometry(0, 0, 800, 480);
9 / 以标题为“QGroupBox 示例”实例化 groupBox 对象 /
10 groupBox = new QGroupBox(tr(“QGroupBox 示例”), this);
11 groupBox->setGeometry(300, 100, 300, 200);
12
13 vBoxLayout = new QVBoxLayout();
14
15 / 字符串链表 /
16 QList list;
17 list<<“选项一”<<“选项二”<<“选项三”;
18 for(int i = 0; i < 3; i++){
19 radioButton[i] = new QRadioButton();
20 radioButton[i]->setText(list[i]);
21 / 在 vBoxLayout 添加 radioButton /
22 vBoxLayout->addWidget(radioButton[i]);
23 }
24 / 添加一个伸缩量 1 /
25 vBoxLayout->addStretch(1);
26 / vBoxLayout 布局设置为 groupBox 布局 */
27 groupBox->setLayout(vBoxLayout);
28 }
29
30 MainWindow::~MainWindow()
31 {
32 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
运行效果
- radioButton 有规则的排布在 groupBox 组框里面
(2)Scroll Area:滚动区域
QScrollArea
-
继承关系:继承自 QAbstractScrollArea
-
功能:显示子部件的内容
-
滚动条:当子部件超出框架大小时会出现滚动条,允许查看完整内容
用法示例
-
使用一个 Label 标签,将 Label 标签设置为一张图片,并把 Label 标签放置于滚动区域内,此时图片应要大于滚动区域才会出现滚动条
-
新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
添加一张资源图片
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7
8 class MainWindow : public QMainWindow
9{
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget parent = nullptr);
14 ~MainWindow();
15
16 private:
17 / 定义 QScrollArea 对象 */
18 QScrollArea *scrollArea;
19 QLabel *label;
20 };
21 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2
3 MainWindow::MainWindow(QWidget parent)
4 : QMainWindow(parent)
5{
6 this->setGeometry(0, 0, 800, 480);
7
8 scrollArea = new QScrollArea(this);
9 / 设置滚动区域为 700380 /
10 scrollArea->setGeometry(50, 50, 700, 380);
11
12 label = new QLabel();
13 / label 显示的 lantingxu.png 图片分辨率为 1076500 */
14 QImage image(“:/images/lantingxu.png”);
15 label->setPixmap(QPixmap::fromImage(image));
16
17 scrollArea->setWidget(label);
18
19 }
20
21 MainWindow::~MainWindow()
22 {
23 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
运行效果
- 由于图片的大小大于滚动区域的大小,所以在滚动区域出现了滚动条,可以拖动滚动条来查看这张图片其余部分
(3)Tool Box:工具箱
QToolBox
-
继承关系:继承自 QFrame
-
功能:提供一列选项卡以显示多个小部件项
-
布局:显示选项卡在一列上,当前项在下方显示
(4)Tab Widget:标签小部件
QTabWidget
-
继承关系:继承自 QWidget
-
功能:提供一组选项卡以实现多页面显示
-
优点:节省界面空间,便于显示更多信息
用法示例
-
创建 3 个页面,每个页面里有一个 Label 标签部件,点击每个页面的选项卡则会切换到不同的页面上
-
新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
添加几张资源图片
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7 #include
8
9 class MainWindow : public QMainWindow
10 {
11 Q_OBJECT
12
13 public:
14 MainWindow(QWidget parent = nullptr);
15 ~MainWindow();
16
17 private:
18 / 声明对象 */
19 QWidget *widget;
20 QTabWidget *tabWidget;
21 QHBoxLayout *hBoxLayout;
22 QLabel *label[3];
23 };
24 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2
3 MainWindow::MainWindow(QWidget parent)
4 : QMainWindow(parent)
5{
6 this->setGeometry(0, 0, 800, 480);
7
8 widget = new QWidget(this);
9 / 居中 /
10 this->setCentralWidget(widget);
11
12 / 多页面小部件 /
13 tabWidget = new QTabWidget();
14
15 / 水平布局实例化 /
16 hBoxLayout = new QHBoxLayout();
17 QList strLabelList;
18 strLabelList<<“标签一”<<“标签二”<<“标签三”;
19
20 QList strTabList;
21 strTabList<<“页面一”<<“页面二”<<“页面三”;
22
23 QList iconList;
24 iconList<<“:/icons/icon1”
25 <<“:/icons/icon2”
26 <<“:/icons/icon3”;
27
28 for (int i = 0; i < 3; i++) {
29 label[i] = new QLabel();
30 / 设置标签文本 /
31 label[i]->setText(strLabelList[i]);
32 / 标签对齐方式(居中) /
33 label[i]->setAlignment(Qt::AlignCenter);
34 / 添加页面 /
35 tabWidget->addTab(label[i],
36 QIcon(iconList[i]),
37 strTabList[i]
38 );
39 }
40 / 是否添加关闭按钮 /
41 //tabWidget->setTabsClosable(true);
42 / 将 tabWidget 水平直排布 /
43 hBoxLayout->addWidget(tabWidget);
44 / 将垂直布局设置到 widget */
45 widget->setLayout(hBoxLayout);
46 }
47
48 MainWindow::~MainWindow()
49 {
50 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
运行效果
- 点击不同页面的选项卡则会切换到不同的页面上
(5)Stacked WIdget:堆叠小部件
QStackedWidget
-
继承关系:继承自 QFrame
-
功能:提供一个小部件堆栈,单次显示一个小部件
-
用途:可与 QListWidget 结合使用,通过列表项切换显示不同内容
-
与 QTabWidget 的对比
-
相似性:可用于创建类似于 QTabWidget 的用户界面
-
底层架构:基于 QStackedLayout 类构建
-
-
通常与 QListWidget 搭配使用,形成左侧列表与右侧内容切换的布局
-
信号槽连接
-
作用:通过信号槽连接,点击左边的 QListWidget 列表项,可以切换右边 QStackedWidget 中显示的内容
-
显示效果:每次点击后,QStackedWidget 会显示一个不同的 widget 小部件
-
用法示例
-
创建 3 个堆栈页面,每个页面里有一个 Label 标签部件,点击每个列表的不同项则会切换到不同的页面上
-
新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7 #include
8 #include
9
10 class MainWindow : public QMainWindow
11 {
12 Q_OBJECT
13
14 public:
15 MainWindow(QWidget parent = nullptr);
16 ~MainWindow();
17
18 private:
19 / widget 小部件 */
20 QWidget widget;
21 / 水平布局 */
22 QHBoxLayout hBoxLayout;
23 / 列表视图 */
24 QListWidget listWidget;
25 / 堆栈窗口部件 */
26 QStackedWidget stackedWidget;
27 / 3 个标签 */
28 QLabel *label[3];
29
30 };
31 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2
3 MainWindow::MainWindow(QWidget parent)
4 : QMainWindow(parent)
5{
6 this->setGeometry(0, 0, 800, 480);
7
8 / widget 小部件实例化 /
9 widget = new QWidget(this);
10
11 / 设置居中 /
12 this->setCentralWidget(widget);
13
14 / 垂直布局实例化 /
15 hBoxLayout = new QHBoxLayout();
16
17 / 堆栈部件实例化 /
18 stackedWidget = new QStackedWidget();
19
20 / 列表实例化 /
21 listWidget = new QListWidget();
22
23 QList strListWidgetList;
24 strListWidgetList<<“窗口一”<<“窗口二”<<“窗口三”;
25
26 for (int i = 0; i < 3; i++){
27 / listWidget 插入项 /
28 listWidget->insertItem(
29 i,
30 strListWidgetList[i]
31 );
32 }
33
34 QList strLabelList;
35 strLabelList<<“标签一”<<“标签二”<<“标签三”;
36
37 for (int i = 0; i < 3; i++){
38 label[i] = new QLabel();
39 / 设置标签文本 /
40 label[i]->setText(strLabelList[i]);
41 / 标签对齐方式(居中) /
42 label[i]->setAlignment(Qt::AlignCenter);
43 / 添加页面 /
44 stackedWidget->addWidget(label[i]);
45 }
46
47 / 设置列表的最大宽度 /
48 listWidget->setMaximumWidth(200);
49 / 添加到水平布局 /
50 hBoxLayout->addWidget(listWidget);
51 hBoxLayout->addWidget(stackedWidget);
52
53 / 将 widget 的布局设置成 hboxLayout /
54 widget->setLayout(hBoxLayout);
55
56 / 利用 listWidget 的信号函数 currentRowChanged()与
57 * 槽函数 setCurrentIndex(),进行信号与槽连接
58 */
59 connect(listWidget, SIGNAL(currentRowChanged(int)),
60 stackedWidget, SLOT(setCurrentIndex(int)));
61 }
62
63 MainWindow::~MainWindow()
64 {
65 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
运行效果
- 点击列表视图的不同的项会切换到不同的页面上
(6)Frame:帧
(7)Widget:小部件
QWidget
-
基类:所有用户界面对象的基类(如 QLabel)
-
功能:基本用户界面单元,接收鼠标、键盘等事件,并绘制自己
-
特性:矩形形状,按照 Z-order 排序,支持移植和自定义
-
矩形形状:每个 Widget 都是矩形的
-
Z-order 排序:Widget 按照 Z-order 进行排序,这决定了窗口重叠时的显示顺序
-
定义:Z-order 是重叠二维对象的顺序,例如堆叠窗口管理器中的窗口
-
GUI 特性:窗口可能重叠,Z-order 决定哪个窗口在顶部
-
三维坐标轴解释:在三维坐标系中,Z 轴表示上下方向,GUI 窗口沿 Z 轴堆叠,Z-order 确定窗口的前后顺序
-
类比:就像桌面上的一叠纸,最上面的纸(窗口)Z 值最高
-
-
(8)MDI Area:MDI 区域
QMdiArea
-
继承关系:继承自 QAbstractScrollArea
-
功能:提供显示 MDI 窗口的区域,类似于窗口管理器
-
使用场景:常用于复杂程序的 MDI 框架,能直接在 Qt Designer 中使用
(9)Dock Widget:停靠窗体部件
QDockWidget
-
继承关系:继承自 QWidget
-
功能:提供可停靠的部件,支持浮动
-
定义:QDockWidget 提供了停靠部件的概念,通常被称为工具面板或实用程序窗口
-
位置:停靠窗口是放置在 QMainWindow 中央窗口附近的辅助窗口
-
-
用途:作为工具面板或实用程序窗口,允许用户在 QMainWindow 内外移动
-
位置控制:可限制移动、浮动和关闭能力,支持不同的停靠区域配置
-
移动与浮动
-
移动能力:停靠窗口可以在当前区域内移动,也可以移动到新的区域
-
浮动功能:用户可以将停靠窗口浮动,即不与 QMainWindow 停靠
-
-
API 控制
- 限制功能:QDockWidget 的 API 允许程序员限制其移动、浮动和关闭能力,以及指定它们可以放置的区域
-
初始停靠区域
-
可选区域
-
Qt.BottomDockWidgetArea:底部停靠
-
Qt.LeftDockWidgetArea:左边停靠
-
Qt.RightDockWidgetArea:右边停靠
-
Qt.TopDockWidgetArea:顶部停靠
-
Qt.NoDockWidgetArea:不显示小部件
-
-
-