百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

正点原子I.MX6U嵌入式Qt开发指南:第七章《Qt控件 5》

bigegpt 2024-10-12 05:26 39 浏览

今日头条/西瓜视频/抖音短视频 同名:正点原子

感谢各位的关注和支持,你们的关注和支持是正点原子无限前进的动力。

第七章《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组框里面。

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...