正点原子I.MX6U嵌入式Qt开发指南:第七章《Qt控件 5》
suiw9 2024-10-27 14:38 39 浏览 0 评论
今日头条/西瓜视频/抖音短视频 同名:正点原子
感谢各位的关注和支持,你们的关注和支持是正点原子无限前进的动力。
第七章《Qt控件 5》
由于本章内容较多,所以第七章《Qt控件》将会分为几个部分进行内容的发布,更多文章内容请持续关注今日头条正点原子官方账号。
7.5布局管理
Qt提供了非常丰富的布局类,基本布局管理类包括:QBoxLayout、QGridLayout、QFormLayout和QStackedLayout。这些类都从QLayout继承而来,它们都来源于QObject(而不是QWidget)。创建更加复杂的布局,可以让它们彼此嵌套完成。
其中QBoxLayout提供了水平和垂直的布局管理;QFormLayout提供了将输入部件和标签成组排列的布局管理;QGridLayout提供了网格形式的布局管理;QStackedLayout提供了一组布局后的部件,可以对它们进行分布显示。
它们的继承关系如下图。
下面将学习Layouts组里面的4种布局,如下图。
各个控件的名称依次解释如下。
(1) Vertiacl Layout:垂直布局
(2) Horizontal Layout:水平布局
(3) Grid Layout:网格布局
(4) Form Layout:表单布局
QBoxLayout继承QLayout。QBoxLayout类提供水平或垂直地排列子部件。QBoxLayout获取从它的父布局或从parentWidget()中所获得的空间,将其分成一列框,并使每个托管小部件填充一个框。
QGridLayout继承QLayout。QGridLayout获取可用的空间(通过其父布局或parentWidget())),将其分为行和列,并将其管理的每个小部件放入正确的单元格中。由于网格布局管理器中的组件也是会随着窗口拉伸而发生变化的,所以也是需要设置组件之间的比例系数的,与QBoxLayout不同的是网格布局管理器还需要分别设置行和列的比例系数。
QFormLayout继承QLayout。QFormLayout类管理输入小部件及其关联标签的表单。QFormLayout是一个方便的布局类,它以两列的形式布局其子类。左列由标签组成,右列由“字段”小部件(QLineEdit(行编辑器)、QSpinBox(旋转框等))组成。通常使用setRowWrapPolicy(RowWrapPolicy policy)接口函数设置布局的换行策略进行布局等。
7.5.1QBoxLayout
7.5.1.1控件简介
QBoxLayout继承QLayout。QBoxLayout类提供水平或垂直地排列子部件。QBoxLayout获取从它的父布局或从parentWidget()中所获得的空间,将其分成一列框,并使每个托管小部件填充一个框。
7.5.1.2用法示例
例29_qboxlayout,垂直或水平布局(难度:简单),使用几个按钮,将他们设置为垂直排布和水平排布,以及设置它们的一些属性。
在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。
在头文件“mainwindow.h”具体代码如下。
mainwindow.h编程后的代码
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QHBoxLayout>
6 #include <QVBoxLayout>
7 #include <QPushButton>
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 QPushButton *pushButton[6];
20
21 /* 定义两个widget,用于容纳排布按钮 */
22 QWidget *hWidget;
23 QWidget *vWidget;
24
25 /* QHBoxLayout与QVBoxLayout对象 */
26 QHBoxLayout *hLayout;
27 QVBoxLayout *vLayout;
28
29 };
30 #endif // MAINWINDOW_H
在源文件“mainwindow.cpp”具体代码如下。
mainwindow.cpp编程后的代码
1 #include "mainwindow.h"
2 #include <QList>
3
4 MainWindow::MainWindow(QWidget *parent)
5 : QMainWindow(parent)
6 {
7 /* 设置主窗口的位置与大小 */
8 this->setGeometry(0, 0, 800, 480);
9
10 /* 实例化与设置位置大小 */
11 hWidget = new QWidget(this);
12 hWidget->setGeometry(0, 0, 800, 240);
13
14 vWidget = new QWidget(this);
15 vWidget->setGeometry(0, 240, 800, 240);
16
17 hLayout = new QHBoxLayout();
18 vLayout = new QVBoxLayout();
19
20 /* QList<T>是Qt的一种泛型容器类。
21 * 它以链表方式存储一组值,
22 * 并能对这组数据进行快速索引
23 */
24 QList <QString>list;
25 /* 将字符串值插入list */
26 list<<"one"<<"two"<<"three"<<"four"<<"five"<<"six";
27
28 /* 用一个循环实例化6个按钮 */
29 for(int i = 0; i < 6; i++){
30 pushButton[i] = new QPushButton();
31 pushButton[i]->setText(list[i]);
32 if(i < 3) {
33 /* 将按钮添加至hLayout中 */
34 hLayout->addWidget(pushButton[i]);
35 } else {
36 /* 将按钮添加至vLayout中 */
37 vLayout->addWidget(pushButton[i]);
38 }
39 }
40 /* 设置间隔为50 */
41 hLayout->setSpacing(50);
42
43 /* hWidget与vWidget的布局设置为hLayout/vLayout */
44 hWidget->setLayout(hLayout);
45 vWidget->setLayout(vLayout);
46 }
47
48 MainWindow::~MainWindow()
49 {
50 }
在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动
main.cpp编程后的代码
1 #include "mainwindow.h"
2
3 #include <QApplication>
4
5 int main(int argc, char *argv[])
6 {
7 QApplication a(argc, argv);
8 MainWindow w;
9 w.show();
10 return a.exec();
11 }
7.5.1.3运行效果
程序编译运行的结果如下。可以看到在hWidget中添加了3个水平排布的按钮,在vWidget中添加了3个垂直排布的按钮。
7.5.2QGridLayout
7.5.2.1控件简介
QGridLayout类提供了布局管理器里的一种以网格(二维)的方式管理界面组件,以按钮组件为例,它们所对应网格的坐标下表,与二维数组类似。
0,0(组件一) | 0,1(组件二) |
1,0(组件三) | 1,1(组件四) |
QGridLayout继承QLayout。QGridLayout获取可用的空间(通过其父布局或parentWidget())),将其分为行和列,并将其管理的每个小部件放入正确的单元格中。由于网格布局管理器中的组件也是会随着窗口拉伸而发生变化的,所以也是需要设置组件之间的比例系数的,与QBoxLayout不同的是网格布局管理器还需要分别设置行和列的比例系数。
7.5.2.2用法示例
例30_qgridlayout,网格布局(难度:简单),使用几个按钮,将他们设置为网格布局,同时设置它们的行、列比例系数(拉伸因子),以及设置它们的一些属性。
在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。
在头文件“mainwindow.h”具体代码如下。
mainwindow.h编程后的代码
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QGridLayout>
6 #include <QPushButton>
7
8 class MainWindow : public QMainWindow
9 {
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget *parent = nullptr);
14 ~MainWindow();
15 private:
16
17 /* 声明widget窗口部件,用于容纳下面4个pushButton按钮 */
18 QWidget *gWidget;
19
20 /* 声明QGridLayout对象 */
21 QGridLayout *gridLayout;
22
23 /* 声明pushButton按钮数组 */
24 QPushButton *pushButton[4];
25
26 };
27 #endif // MAINWINDOW_H
在源文件“mainwindow.cpp”具体代码如下。
mainwindow.cpp编程后的代码
1 #include "mainwindow.h"
2
3 MainWindow::MainWindow(QWidget *parent)
4 : QMainWindow(parent)
5 {
6 /* 设置位置与大小 */
7 this->setGeometry(0, 0, 800, 480);
8
9 /* 实例化 */
10 gWidget = new QWidget(this);
11 /* 设置gWidget居中央 */
12 this->setCentralWidget(gWidget);
13
14 gridLayout = new QGridLayout();
15 /* QList链表,字符串类型 */
16 QList <QString> list;
17 list<<"按钮1"<<"按钮2"<<"按钮3"<<"按钮4";
18 for (int i = 0; i < 4; i++){
19 pushButton[i] = new QPushButton();
20 pushButton[i]->setText(list[i]);
21 /* 设置最小宽度与高度 */
22 pushButton[i]->setMinimumSize(100, 30);
23 /* 自动调整按钮的大小 */
24 pushButton[i]->setSizePolicy(
25 QSizePolicy::Expanding,
26 QSizePolicy::Expanding
27 );
28 switch (i) {
29 case 0:
30 /* 将pushButton[0]添加至网格的坐标(0,0),下同 */
31 gridLayout->addWidget(pushButton[i], 0, 0);
32 break;
33 case 1:
34 gridLayout->addWidget(pushButton[i], 0, 1);
35 break;
36 case 2:
37 gridLayout->addWidget(pushButton[i], 1, 0);
38 break;
39 case 3:
40 gridLayout->addWidget(pushButton[i], 1, 1);
41 break;
42 default:
43 break;
44 }
45 }
46 /* 设置第0行与第1行的行比例系数 */
47 gridLayout->setRowStretch(0, 2);
48 gridLayout->setRowStretch(1, 3);
49
50 /* 设置第0列与第1列的列比例系数 */
51 gridLayout->setColumnStretch(0, 1);
52 gridLayout->setColumnStretch(1, 3);
53
54 /* 将gridLayout设置到gWidget */
55 gWidget->setLayout(gridLayout);
56 }
57
58 MainWindow::~MainWindow()
59 {
60 }
在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动。
main.cpp编程后的代码
1 #include "mainwindow.h"
2
3 #include <QApplication>
4
5 int main(int argc, char *argv[])
6 {
7 QApplication a(argc, argv);
8 MainWindow w;
9 w.show();
10 return a.exec();
11 }
7.5.2.3运行效果
程序编译运行的结果如下。可以看到在gWidget中添加了4个按钮,因为设置了行、列的系数比(拉伸因子),所以看到的按钮是按系数比的比例显示。
7.5.3QFormLayout
7.5.3.1控件简介
QFormLayout继承QLayout。QFormLayout类管理输入小部件及其关联标签的表单。QFormLayout是一个方便的布局类,它以两列的形式布局其子类。左列由标签组成,右列由“字段”小部件(QLineEdit(行编辑器)、QSpinBox(旋转框等))组成。通常使用setRowWrapPolicy(RowWrapPolicy policy)接口函数设置布局的换行策略进行布局等。
7.5.3.2用法示例
例31_qformlayout,表单布局(难度:简单),将使用addRow(const QString &labelText, QWidget *field)来创建一个带有给定文本的QLabel及QWidget小部件,并且它们是伙伴关系。简单的展示表单布局的使用。
在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。
在头文件“mainwindow.h”具体代码如下。
mainwindow.h编程后的代码
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QFormLayout>
6 #include <QLineEdit>
7
8 class MainWindow : public QMainWindow
9 {
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget *parent = nullptr);
14 ~MainWindow();
15 private:
16 /* widget对象 */
17 QWidget *fWidget;
18
19 /* 用于输入用户名 */
20 QLineEdit *userLineEdit;
21
22 /* 用于输入密码 */
23 QLineEdit *passwordLineEdit;
24
25 /* 声明QFormLayout对象 */
26 QFormLayout *formLayout;
27 };
28 #endif // MAINWINDOW_H
在源文件“mainwindow.cpp”具体代码如下。
mainwindow.cpp编程后的代码
1 #include "mainwindow.h"
2
3 MainWindow::MainWindow(QWidget *parent)
4 : QMainWindow(parent)
5 {
6 /* 设置位置与大小 */
7 this->setGeometry(0, 0, 800, 480);
8
9 /* 实例化及设置位置与大小,下同 */
10 fWidget = new QWidget(this);
11 fWidget->setGeometry(250, 100, 300, 200);
12
13 userLineEdit = new QLineEdit();
14 passwordLineEdit = new QLineEdit();
15
16 formLayout = new QFormLayout();
17
18 /* 添加行 */
19 formLayout->addRow("用户名:", userLineEdit);
20 formLayout->addRow("密码 :", passwordLineEdit);
21
22 /* 设置水平垂直间距 */
23 formLayout->setSpacing(10);
24
25 /* 设置布局外框的宽度 */
26 formLayout->setMargin(20);
27
28 /* 将formLayout布局到fWidget */
29 fWidget->setLayout(formLayout);
30 }
31
32 MainWindow::~MainWindow()
33 {
34 }
在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动。
main.cpp编程后的代码
1 #include "mainwindow.h"
2
3 #include <QApplication>
4
5 int main(int argc, char *argv[])
6 {
7 QApplication a(argc, argv);
8 MainWindow w;
9 w.show();
10 return a.exec();
11 }
7.5.3.3运行效果
程序编译运行的结果如下。可以看到在fWidget中添加了两行,同时设置了它们的间隔,与距边框的宽度。与QGirdLayout布局比较,QFomLayout布局比较适用于行与列比较少的布局格局。如果是多行多列的布局,应该使用QGirdLayout布局。
7.6空间间隔
空间间隔组(Spacers),如下图所示
(1) Horizontal Spacer:水平间隔
(2) Vertical Spacer:垂直间隔
QSpacerItem继承QLayoutItem。QSpacerItem类在布局中提供空白(空间间隔)。所以QSpacerItem是在布局中使用的。它包含Horizontal Spacer(水平间隔)与Vertical Spacer(垂直间隔)。
7.6.1QSpacerItem
7.6.1.1控件简介
QSpacerItem继承QLayoutItem。QSpacerItem类在布局中提供空白(空间间隔)。所以QSpacerItem是在布局中使用的。
7.6.1.2用法示例
例32_qspaceritem,空间间隔(难度:一般),使用4个按钮,在垂直布局添加垂直间隔与按钮1,在水平布局添加按钮2~4与水平间隔。简单的展示空间间隔布局的使用方法。在程序运行结果分析了空间间隔部分。
在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。
在头文件“mainwindow.h”具体代码如下。
mainwindow.h编程后的代码
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QPushButton>
6 #include <QSpacerItem>
7 #include <QBoxLayout>
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 QPushButton *bt[4];
20 /* 垂直间隔 */
21 QSpacerItem *vSpacer;
22 /* 水平间隔 */
23 QSpacerItem *hSpacer;
24 /* 声明一个widget用来存放布局的内容 */
25 QWidget *widget;
26 /* 主布局对象 */
27 QHBoxLayout *mainLayout;
28 /* 垂直布局对象 */
29 QVBoxLayout *vBoxLayout;
30 /* 水平布局对象 */
31 QHBoxLayout *hBoxLayout;
32
33 };
34 #endif // MAINWINDOW_H
在源文件“mainwindow.cpp”具体代码如下。
mainwindow.cpp编程后的代码
1 #include "mainwindow.h"
2
3 MainWindow::MainWindow(QWidget *parent)
4 : QMainWindow(parent)
5 {
6 /* 设置主窗体显示位置与大小 */
7 this->setGeometry(0, 0, 800, 480);
8
9 widget = new QWidget(this);
10 /* 居中widget */
11 this->setCentralWidget(widget);
12
13 /* 实例化对象 */
14 vSpacer = new QSpacerItem(10, 10,
15 QSizePolicy::Minimum,
16 QSizePolicy::Expanding
17 );
18 hSpacer = new QSpacerItem(10, 10,
19 QSizePolicy::Expanding,
20 QSizePolicy::Minimum
21 );
22
23 vBoxLayout = new QVBoxLayout();
24 hBoxLayout = new QHBoxLayout();
25 mainLayout = new QHBoxLayout();
26
27 /* 在vBoxLayout添加垂直间隔 */
28 vBoxLayout->addSpacerItem(vSpacer);
29
30 QList <QString>list;
31 /* 将字符串值插入list */
32 list<<"按钮1"<<"按钮2"<<"按钮3"<<"按钮4";
33 /* 用一个循环实例化4个按钮 */
34 for(int i = 0; i < 4 ; i++){
35 bt[i] = new QPushButton();
36 bt[i]->setText(list[i]);
37 if (i == 0){
38 /* 按钮1,设置为100*100 */
39 bt[i]->setFixedSize(100, 100);
40 /* 在vBoxLayout添加按钮1 */
41 vBoxLayout->addWidget(bt[i]);
42 } else {
43 /* 按钮2~4,设置为60*60 */
44 bt[i]->setFixedSize(60, 60);
45 /* 在hBoxLayout添加按钮2~4 */
46 hBoxLayout->addWidget(bt[i]);
47 }
48 }
49 /* 在hBoxLayout添加水平间隔 */
50 hBoxLayout->addSpacerItem(hSpacer);
51
52 /* 在主布局里添加垂直布局 */
53 mainLayout->addLayout(vBoxLayout);
54 /* 在主布局里添加水平布局 */
55 mainLayout->addLayout(hBoxLayout);
56
57 /* 设置部件间距 */
58 mainLayout->setSpacing(50);
59 /* 将主布局设置为widget的布局 */
60 widget->setLayout(mainLayout);
61
62 }
63
64 MainWindow::~MainWindow()
65 {
66 }
在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动。
main.cpp编程后的代码
1 #include "mainwindow.h"
2
3 #include <QApplication>
4
5 int main(int argc, char *argv[])
6 {
7 QApplication a(argc, argv);
8 MainWindow w;
9 w.show();
10 return a.exec();
11 }
7.6.1.3运行效果
程序编译运行的结果如下,在垂直布局里添加了垂直空间间隔与按钮1,在水平布局里添加了按钮2~4与水平空间间隔。
图解如下:
7.7容器
容器(Containers)
各个控件的名称依次解释如下。
(1) Group Box:组框
(2) Scroll Area:滚动区域
(3) Tool Box:工具箱
(4) Tab Widget:标签小部件
(5) Stacked WIdget:堆叠小部件
(6) Frame:帧
(7) Widget:小部件
(8) MDI Area:MDI区域
(9) Dock Widget:停靠窗体部件
各种容器的解释如下:
QGroupBox继承QWidget。QGroupBox为构建分组框提供了支持。分组框通常带有一个边框和一个标题栏,作为容器部件来使用,在其中可以布置各种窗口部件。布局时可用作一组控件的容器,但是需要注意的是,内部通常使用布局控件(如QBoxLayout)进行布局。组框还提供键盘快捷方式,键盘快捷方式将键盘焦点移动到组框的一个子部件。
QScrollArea继承QAbstractScrollArea。滚动区域用于在框架中显示子部件的内容。如果小部件超过框架的大小,视图就会出现滚动条,以便可以查看子小部件的整个区域。
QToolBox继承QFrame。QToolBox类提供了一列选项卡小部件项。工具箱是一个小部件,它显示一列选项卡在另一列的上面,当前项显示在当前选项卡的下面。每个选项卡在选项卡列中都有一个索引位置。选项卡的项是QWidget。
QTabWidget继承QWidget。abWidget类提供了一组选项卡(多页面)小部件。QTabWidget主要是用来分页显示的,每一页一个界面,众多界面公用一块区域,节省了界面大小,很方便的为用户显示更多的信息。
QStackedWidget继承QFrame。QStackedWidget类提供了一个小部件堆栈,其中一次只能看到一个小部件,与QQ的设置面板类似。QStackedWidget可用于创建类似于QTabWidget提供的用户界面。它是构建在QStackedLayout类之上的一个方便的布局小部件。常与QListWidget搭配使用,效果如下图,左边的是QListWidget列表,右边的是QStackedWidget。他们一般与信号槽连接,通过点击左边的QListWidget列表,使用信号槽连接后,就可以让右边的QStackedWidget显示不同的内容,每次显示一个widget小部件。
QWidget类是所有用户界面对象的基类(如QLabel类继承于QFrame类,而QFrame类又继承于QWidget类)。Widget是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己。每个Widget都是矩形的,它们按照Z-order进行排序。 注:Z-order是重叠二维对象的顺序,例如堆叠窗口管理器中的窗口。典型的GUI的特征之一是窗口可能重叠,使得一个窗口隐藏另一个窗口的一部分或全部。当两个窗口重叠时,它们的Z顺序确定哪个窗口出现在另一个窗口的顶部。理解:术语"z-order"指沿着z轴物体的顺序。三维坐标轴中x横轴,y数轴,z上下轴。可以将gui窗口视为平行与显示平面的一系列平面。因此,窗口沿着z轴堆叠。所以z-order指定了窗口的前后顺序。就像您桌面上的一叠纸一样,每张纸是一个窗口,桌面是您的屏幕,最上面的窗口z值最高。QWidget不是一个抽象类,它可以用作其他Widget的容器,并很容易作为子类来创建定制Widget。它经常用于创建、放置和容纳其他的Widget窗口。由上可知,QWidget一般用于容纳其他Widget窗口,其属性和方法相当的多,对于初学者,我们通常只用它来作可以容纳其他窗口的容器,还会用来接收鼠标,键盘和其他事件等。
QMdiArea继承QAbstractScrollArea。QMdiArea小部件提供一个显示MDI窗口的区域。
QMdiArea的功能本质上类似于MDI窗口的窗口管理器。大多数复杂的程序,都使用MDI框架,在Qt designer中可以直接将控件MDI Area拖入使用。
QDockWidget继承QWidget。QDockWidget类提供了一个小部件,可以停靠在QMainWindow内,也可以作为桌面的顶级窗口浮动。QDockWidget提供了停靠部件的概念,也称为工具面板或实用程序窗口。停靠窗口是放置在QMainWindow中央窗口附近的停靠窗口部件区域中的辅助窗口。停靠窗口可以被移动到当前区域内,移动到新的区域,并由终端用户浮动(例如,不停靠)。QDockWidget API允许程序员限制dock widget的移动、浮动和关闭能力,以及它们可以放置的区域。QDockWidget的初始停靠区域有Qt.BottomDockWidgetArea(底部停靠)、Qt.LeftDockWidgetArea(左边停靠、Qt.RightDockWidgetArea(右边停靠)、Qt.TopDockWidgetArea(顶部停靠)和Qt.NoDockWidgetArea(不显示Widget)。
在前面某些小节里已经有使用过本小节的控件,例如QWidget小部件。下面将上面列出的控件进行进一步的解释与运用。
7.7.1QGroupBox
7.7.1.1控件简介
QGroupBox小部件提供一个带有标题的组框框架。一般与一组或者是同类型的部件一起使用。
7.7.1.2用法示例
例33_qgroupbox,组框示例(难度:简单),使用3个QRadioButton单选框按钮,与QVBoxLayout(垂直布局)来展示组框的基本使用。
在新建例程中不要勾选“Generate form”,默认继承QMainWindow类即可。项目新建完成如下图。
在头文件“mainwindow.h”具体代码如下。
mainwindow.h编程后的代码
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QRadioButton>
6 #include <QGroupBox>
7 #include <QVBoxLayout>
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
在源文件“mainwindow.cpp”具体代码如下。
mainwindow.cpp编程后的代码
1 #include "mainwindow.h"
2 #include <QList>
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 <QString>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 }
在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动。
main.cpp编程后的代码
1 #include "mainwindow.h"
2
3 #include <QApplication>
4
5 int main(int argc, char *argv[])
6 {
7 QApplication a(argc, argv);
8 MainWindow w;
9 w.show();
10 return a.exec();
11 }
7.7.1.3运行效果
程序编译运行的结果如下,可以看到radioButton有规则的排布在groupBox组框里面。
相关推荐
- 5款Syslog集中系统日志常用工具对比推荐
-
一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
-
简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
-
NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
-
一、什么场景使用MongoDB?...
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
-
作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
-
前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...
- solidworks使用心得,纯干货!建议大家收藏
-
SolidWorks常见问题...
- 统一规约-关乎数字化的真正实现(规范统一性)
-
尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...
- Elasticsearch节点角色配置详解(Node)
-
本篇文章将介绍如下内容:节点角色简介...
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
-
作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...
- 比任何人都光彩照人的假期!水润、紧致的肌肤护理程序
-
图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...
- Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型
-
中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...
- 柔性——面向大规模定制生产的数字化实现的基本特征
-
大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...
- 创建PLC内部标准——企业前进的道路
-
作者:FrankBurger...
- 标准化编程之 ----------- 西门子LPMLV30测试总结
-
PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
-
- 5款Syslog集中系统日志常用工具对比推荐
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
- solidworks使用心得,纯干货!建议大家收藏
- 统一规约-关乎数字化的真正实现(规范统一性)
- Elasticsearch节点角色配置详解(Node)
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)