欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > Qt开发⑥Qt常用控件_下_多元素控件+容器类控件+布局管理器

Qt开发⑥Qt常用控件_下_多元素控件+容器类控件+布局管理器

2025/2/22 8:03:07 来源:https://blog.csdn.net/GRrtx/article/details/145653901  浏览:    关键词:Qt开发⑥Qt常用控件_下_多元素控件+容器类控件+布局管理器

目录

1. 多元素控件

1.1 ?Widget 和 ?View 之间的区别

1.2 List Widget 纵向列表

1.3 Table Widget 表格

1.4 Tree Widget 树形控件

2. 容器类控件

2.1 Group Box 分组框

2.2 Tab Widget 标签页控件

3. 布局管理器

3.1 垂直布局QVBoxLayout

3.2 水平布局QHBoxLayout

3.3 网格布局QGridLayout

3.4 表单布局QFormLayout

3.5 Spacer 空白

本篇完。


1. 多元素控件

Qt 中提供的多元素控件有:

  • QListWidget
  • QListView
  • QTableWidget
  • QTableView
  • QTreeWidget
  • QTreeView

1.1 ?Widget 和 ?View 之间的区别

以 QTableWidget 和 QTableView 为例。

  • QTableView 是基于 MVC 设计的控件。QTableView 自身不持有数据,使用 QTableView 的时候需要用户创建一个 Model 对象(比如 QStandardModel),并且把 Model 和 QTableView 关联起来。后续修改 Model 中的数据就会影响 QTableView 的显示,修改 QTableView 的显示也会影响到 Model 中的数据(双向绑定)。
  • QTableWidget 则是 QTableView 的子类,对 Model 进行了封装,不需要用户手动创建 Model 对象,直接就可以往 QTableWidget 中添加数据了。

1.2 List Widget 纵向列表

使用 QListWidget 能够显示一个纵向的列表。形如:

每个选项都可以被选中。

核心属性:

核心方法:

核心信号:

在上述介绍中涉及到⼀个关键的类:QListWidgetItem,这个类表示 QListWidget 中的一个元素。

核心方法如下,本质上就是⼀个 “文本+图标” 构成的。


使用 ListWidget,案例演示:

(1)在界面上创建一个 ListView,右键 => 变形为 => ListWidget,再创建一个 lineEdit 和两个按钮。

注意:ListWidget 是 ListView 的子类,功能比 ListView 更丰富。我们使用 ListWidget 即可。


(2)编写 widget.cpp,在构造函数中添加初始元素

或者直接在图形化界面选择 “编辑项目”:


(3)编写 listWidget 的 slot 函数

此处需要判定 current 和 previous 非空,初始情况下是没有元素选中的,就导致这两个指针可能是 NULL。

这⾥需要给 widget.h 前⾯加上 #include <QListWidgetItem>。


(4)编写按钮的 slot 函数


(5)执行程序

可以新增元素,选中元素,删除元素


1.3 Table Widget 表格

        使用 QTableWidget 表示一个表格控件。一个表格中包含若干行,每一行又包含若干列。表格中的每个单元格,是一个 QTableWidgetItem 对象。

QTableWidgetItem 核心信号:

QTableWidgetItem 核心方法:


使用 QTableWidget,案例演示:

(1)在界面上创建 QTableWidget 和 三个按钮,一个输入框

        注意:QTableWidget 是 QTableView 的子类,功能比 QTableView 更丰富。我们使用 QTableWidget 即可。


(2)编写 widget.cpp 构造函数,构造表格中的初始数据


(3)编写按钮的 slot 函数


(4)执行程序,即可完成表格的基本操作

        默认情况下,单元格中的内容直接就是可编辑的。如果不想让用户编辑,可以设置 ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);


1.4 Tree Widget 树形控件

        使用 QTreeWidget 表示一个树形控件,里面的每个元素都是一个 QTreeWidgetItem,每个 QTreeWidgetItem 可以包含多个文本和图标,每个文本 / 图标为一个列。

        可以给 QTreeWidget 设置顶层节点(顶层节点可以有多个),然后再给顶层节点添加子节点,从而构成树形结构。

QTreeWidget 核心方法:

QTreeWidget 核心信号:

QTreeWidgetItem 核心属性:

QTreeWidgetItem 核心方法:


使用 QTreeWidget,案例演示:

(1)在界面上创建一个 TreeView,右键 => 变形为 => TreeWidget,再创建一个 lineEdit 和两个按钮。

注意:TreeWidget 是 TreeView 的子类,功能比 TreeView 更丰富。我们使用 TreeWidget 即可。


(2)编写代码,构造初始数据


(3)编写代码,实现按钮的 slot 函数


(4)执行程序,可以针对树形框进行编辑


2. 容器类控件

2.1 Group Box 分组框

        使用 QGroupBox 实现一个带有标题的分组框,可以把其他的控件放到里面作为一组,这样看起来能更好看一点。

        注意:不要把 QGroupBox 和 QButtonGroup 混淆(之前在介绍 QRadionButton 的时候提到了 QButtonGroup)。

核心属性:

        分组框只是一个用来 “美化界面” 这样的组件,并不涉及到用户交互和业务逻辑,属于 “锦上添花"。


给麦当劳案例加上分组框,案例演示:

在界面上创建三个分组框,并且在分组框内部创建下拉框和微调框

注意:在复制粘贴控件的时候,一定要先选中对应的父控件,再粘贴。


2.2 Tab Widget 标签页控件

        使用 QTabWidget 实现一个带有标签页的控件,可以往里面添加一些 widget,进一步的就可以通过标签页来切换。

核心属性:

核心信号:


使用标签页管理多组控件,案例演示:

(1)在界面上创建一个 QTabWidget 和两个按钮

注意 :

  • QTabWidget 中的每个标签页都是一个 QWidget
  • 点击标签页就可以直接切换
  • 右键 QTabWidget,可以添加标签页或者删除标签页

(2)编写 widget.cpp,进行初始化,给标签页中放个简单的 label

注意新创建的 label 的父元素,是 ui->tab 和 ui->tab_2。Qt 中使用父子关系决定该控件 “在哪里”。


(3)编写按钮的 slot 函数

  • 使用 count() 获取到标签页的个数
  • 使用 addTab 新增标签页
  • 使用 removeTab 删除标签页
  • 使用 currentIndex 获取到当前标签页的下标
  • 使用 setCurrentIndex 切换当前标签页


(4)编写 QTabWidget 的 currentChanged 函数


(5)运行程序

  • 点击新建标签页,可以创建出新的标签
  • 点击删除当前标签页,可以删除标签
  • 切换标签页时,可以看到 qDebug 打印出的标签页编号


3. 布局管理器

        之前使用 Qt 在界面上创建的控件都是通过 “绝对定位” 的方式来设定的,也就是每个控件所在的位置都需要计算坐标,最终通过 setGeometry 或者 move 方式摆放过去。

        这种设定方式其实并不方便,尤其是界面如果内容比较多,不好计算,而且一个窗口大小往往是可以调整的,按照绝对定位的方式,也无法自适应窗口大小。因此 Qt 引入 “布局管理器”(Layout)机制来解决上述问题。

当然,布局管理器并非 Qt 独有。其他的 GUI 开发框架,像 Android、前端等也有类似的机制。


3.1 垂直布局QVBoxLayout

使用 QVBoxLayout 表示垂直的布局管理器,V 是 vertical 的缩写。

核心属性:

Layout 只是用于界面布局,并没有提供信号。


使用 QVBoxLayout 管理多个控件,案例演示:

(1)编写代码,创建布局管理器和三个按钮,并且把按钮添加到布局管理器中

  • 使用 addWidget 把控件添加到布局管理器中
  • 使用 setLayout 设置该布局管理器到 widget 中


(2)运行程序

        可以看到此时界面上的按钮就存在于布局管理器中,随着窗口尺存变化而发生改变。此时的三个按钮的尺存和位置都是自动计算出来的。

        通过上述代码的方式,只能给这个 widget 设定一个布局管理器。实际上也可以通过 Qt Design 在一个窗口中创建多个布局管理器。


创建两个 QVBoxLayout,案例演示:

(1)在界面上创建两个 QVBoxLayout,每个 QVBoxLayout 各放三个按钮


(2)运行程序

可以看到这些按钮已经自动排列好,只不过当前这些按钮的位置不能随着窗口大小自动变化。

        通过 Qt Designer 创建的布局管理,其实是先创建了一个 widget,设置过 geometry 属性的,再把这个 layout 设置到这个 widget 中。

        实际上,一个 widget 只能包含一个 layout。打开 ui 文件的原始 xml,可以看到其中的端倪。这种情况下 layout 并非是窗口 widget 的布局管理器,因此不会随着窗口大小改变。


3.2 水平布局QHBoxLayout

使用 QHBoxLayout 表示垂直的布局管理器,H 是 horizontal 的缩写。

核心属性(和 QVBoxLayout 属性是一致的)


使用 QHBoxLayout 管理控件,案例演示:

(1)编写代码,创建布局管理器和三个按钮,并且把按钮添加到布局管理器中


(2)运行程序

        可以看到此时界面上的按钮就存在于布局管理器中,随着窗口尺寸变化而发生改变。此时的三个按钮的尺存和位置都是自动计算出来的。

Layout 里面可以再嵌套上其他的 layout,从而达到更复杂的布局效果。


嵌套的 layout,案例演示:

(1)在代码中创建以下内容

使用 addLayout 给 layout 中添加子 layout:


(2)执行程序

结合 QHBoxLayout 和 QVBoxLayout, 就可以做出各种复杂的界面了。


3.3 网格布局QGridLayout

Qt 中还提供了 QGridLayout 用来实现网格布局的效果,可以达到 M * N 的这种网格的效果。

核心属性:

        整体和 QVBoxLayout 以及 QHBoxLayout 相似,但是设置 spacing 的时候是按照垂直水平两个方向来设置的。


使用 QGridLayout 管理元素,案例演示:

(1)代码中创建 QGridLayout 和 4 个按钮

        使用 addWidget 添加控件到布局管理器中,但是添加的同时会指定两个坐标,表示放在第几行,第几列。

(2)执行代码

可以看到当前的这几个按钮是按照 2 行 2 列的方式排列的:


(3)如果调整行列坐标为下列代码

执行代码可以看到这几个按钮都在同一行了,相当于 QHBoxLayout:


如果调整行列坐标为下列代码

执行代码可以看到这几个按钮都在同一列了,相当于 QVBoxLayout:


任意调整行列,即可看到不同的效果


看下面代码:

        注意 :设置行和列的时候,如果设置的是一个很大的值,但是这个值和上一个值之间并没有其他的元素,那么并不会在中间腾出额外的空间。

        虽然把 button4 设置在第 100 行,但是由于 3-99 行没有元素,因此 button4 仍然会紧挨在 button3 下方看起来和上面的 0 1 2 3 的情况是相同的。


设置 QGridLayout 中元素的大小比例,案例演示:

(1)创建 6 个按钮,按照 2 行 3 列的方式排列

使用 setColumnStretch 设置每一列的拉伸系数:


(2)执行程序

可以看到每一列的宽度是不同的,并且随着窗口调整动态变化:

另外,QGridLayout 也提供了 setRowStretch 设置行之间的拉伸系数。

        上述案例中,直接设置 setRowStretch 效果不明显,因为每个按钮的高度是固定的。需要把按钮的垂直方向的 sizePolicy 属性设置为 QSizePolicy::Expanding 尽可能填充满布局管理器,才能看到效果。

如果拉伸系数设为 0,意思是不参与拉伸,此时按钮的宽度是固定值。


设置垂直方向的拉伸系数,案例演示:

(1)编写代码, 创建 6 个按钮, 按照 3 行 2 列方式排列.

使用  setSizePolicy 设置按钮的尺寸策略,可选的值如下:

  • QSizePolicy::Ignored:忽略控件的尺寸,不对布局产生影响。
  • QSizePolicy::Minimum:控件的最小尺寸为固定值,布局时不会超过该值。
  • QSizePolicy::Maximum:控件的最大尺寸为固定值,布局时不会小于该值。
  • QSizePolicy::Preferred:控件的理想尺寸为固定值,布局时会尽量接近该值。
  • QSizePolicy::Expanding:控件的尺寸可以根据空间调整,尽可能占据更多空间。
  • QSizePolicy::Shrinking:控件的尺寸可以根据空间调整,尽可能缩小以适应空间。


(2)执行代码

此时的按钮垂直方向都舒展开了,并且调整窗口尺寸,也会按照设定的比例同步变化。

        总的来说,使用 QGridLayout 能够代替很多 QHBoxLayout 和 QVBoxLayout 嵌套的场景。毕竟嵌套的代码写起来是比较麻烦的。另外不要忘了,QGridLayout 里面也能嵌套 QHBoxLayout 和 QVBoxLayout,QHBoxLayout 和 QVBoxLayout 里面也能嵌套 QGridLayout。灵活使用上述布局管理器就可以实现出任意的复杂界面。


3.4 表单布局QFormLayout

        除了上述的布局管理器之外,Qt 还提供了 QFormLayout,属于是 QGridLayout 的特殊情况,专门用于实现两列表单的布局。

这种表单布局多用于让用户填写信息的场景,左侧列为提示,右侧列为输入框。


使用 QFormLayout 创建表单,案例演示:

(1)编写代码,创建 QFormLayout,以及三个 label 和三个 lineEdit

  • 使用 addRow 方法来添加一行,每行包含两个控件。第一个控件固定是 QLabel / 文本,第二个控件则可以是任意控件。
  • 如果把第⼀个参数填写为 NULL,则什么都不显示。


(2)执行程序


3.5 Spacer 空白

使用布局管理器的时候,可能需要在控件之间添加一段空白,就可以使用 QSpacerItem 来表示。

核心属性:

上述属性在构造函数设置即可。


创建一组左右排列的按钮,案例演示:

(1)在界面上创建一个 QVBoxLayout ,并添加两个按钮


(2)直接运行程序,可以看到两个按钮是紧挨着的


(3)在两个按钮中间添加一个 spacer


(4)运行程序

        可以看到两个按钮之间已经存在了间隔了,调整 QSpacerItem 不同的尺寸,即可看到不同的间距:

在 Qt Designer 中,也可以直接给界面上添加 spacer:


本篇完。

下一篇是Qt窗口的学习。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词