多元素控件
常见的多元素空间:QListView/QListWidget、QTableView/QTableWidget、QTreeView/QTreeWidget
| 组件组 | 核心特点(展示 + 用法) | 适用场景 |
|---|---|---|
| QListView/QListWidget | 一维列表 / 图标网格(无层级、单列 / 多列网格);Widget 更省事 | 简单选项、文件列表、图标墙 |
| QTableView/QTableWidget | 二维表格(多行多列,结构化数据);Widget 直接操作单元格 | 表单、数据报表、表格数据 |
| QTreeView/QTreeWidget | 树形层级(父子节点,支持折叠展开);Widget 直接加节点 | 目录结构、分类列表、层级数据 |
Widget的是便捷版(内置数据模型),直接加条目 / 单元格 / 节点,快速开发;View的是灵活版(需手动绑模型),支持复杂自定义(如改样式、联动数据)。
1. QListWidget
QlistWidget 表示一个一维列表,预期效果:

常见属性:
| 属性 | 说明 |
|---|---|
| currentRow | 当前被选中的是第几行 |
| count | 一共有多少行 |
| sortingEnabled | 是否允许排序 |
| isWrapping | 是否允许换行 |
| itemAlignment | 元素的对齐方式 |
| selectRectVisible | 被选中的元素矩形是否可见 |
| spacing | 元素之间的间隔 |
常用方法:
addItem:添加一个元素(参数可以是QString类型、也可以是QListWidgetItem*类型)currentItem:返回当前选择元素,返回QListWidgetItem*类型setcurrentItem/setcurrentRow:通过QListWidgetItem*或者行号来设置选择哪个元素item:根据行号返回元素insertItem:在指定位置(行)插入元素(可以使用QString也可以使用QListWidgetItem*)takeItem:删除指定行的元素,返回QListWidgetItem*执行被删除的元素
QListWidgetItem信号:
| 信号 | 说明 |
|---|---|
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old) |
选中不同元素时会触发,参数是当前选中的元素和之前选中的元素 |
currentRowChanged(int) |
选中不同元素时会触发,参数是当前选中元素的行数 |
itemClicked(QListWidgetItem* item) |
点击某个元素时触发 |
itemDoubleClicked(QListWidgetItem* item) |
双击某个元素时触发 |
itemEntered(QListWidgetItem* item) |
鼠标进入元素时触发 |
简单了解了这些属性、方法跟信号,现在来看如何去使用 QListWidget
- 图形化界面操作
使用ui文件、图形化界面操作还是非常方便的:
- 在左侧控件中找到
ListWidget,拖拽到中间界面上 - 双击(或者右键,点击编辑项目)即可进入到编辑界面
- 点击下方
+新增一行,选择指定行再点击-删除选中行

- 通过代码添加元素
还是先通过ui界面创建出来一个ListWidget,再通过代码添加元素。
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->listWidget->addItem("斗罗大陆");
ui->listWidget->addItem("完美世界");
//指定行表示该元素插入后是第row行, 下标从0开始
ui->listWidget->insertItem(1,"仙逆");
QListWidgetItem* item1 = new QListWidgetItem();
item1->setText("吞噬星空");
ui->listWidget->addItem(item1);
QListWidgetItem* item2 = new QListWidgetItem();
item2->setText("遮天");
ui->listWidget->insertItem(2,item2);
}
注意:
这里的
insertItem在指定行插入,表示插入元素插入后是第几行(不是在第几行后面插入)
- 用户输入文本,通过点击新增/删除按钮来控制和删除元素
这里就实现三个按钮:
- 新增元素:在最后一行新增元素
- 当前行新增:在选中行新增元素
- 删除元素:删除指定行元素

cpp
void Widget::on_pushButton_add_clicked()
{
QString text = ui->lineEdit->text();
if(text == "") // 没有输入内容
return;
ui->listWidget->addItem(text);
}
void Widget::on_pushButton_insert_clicked()
{
QString text = ui->lineEdit->text();
if(text == "")
return;
int row = ui->listWidget->currentRow();
if(row == -1) //没有选中元素
return;
ui->listWidget->insertItem(row,text);
}
void Widget::on_pushButton_sub_clicked()
{
int row = ui->listWidget->currentRow();
if(row == -1)
return;
ui->listWidget->takeItem(row);
}
QListWidgetItem:
对于
QlistWidgetItem类,其本质是就是 文本 + 图像。常用方法:
setFont:设置字体;setIcon:设置图像;setHidden:设置隐藏;setSizeHint:设置尺寸;setSelected:设置是否能选中;setText:设置文本;setTextAlignment:设置文本对齐方式。
2. QTableWidget
QTableWidget 表示一个表格控件,有若干行若干列。
其中每一个单元格都是一个QTableWidgetItem对象

| 方法 | 说明 |
|---|---|
item(int row, int column) |
根据行数列数获取指定的 QTableWidgetItem* |
setItem(int row, int column, QTableWidgetItem*) |
根据行数列数设置表格中的元素 |
currentItem() |
返回被选中的元素 QTableWidgetItem* |
currentRow() |
返回被选中元素是第几行 |
currentColumn() |
返回被选中元素是第几列 |
row(QTableWidgetItem* item) |
获取指定 item 是第几行 |
column(QTableWidgetItem* item) |
获取指定 item 是第几列 |
rowCount() |
获取行数 |
columnCount() |
获取列数 |
insertRow(int row) |
在第 row 行处插入新行 |
insertColumn(int column) |
在第 column 列插入新列 |
removeRow(int row) |
删除第 row 行 |
removeColumn(int column) |
删除第 column 列 |
setHorizontalHeaderItem(int column, QTableWidgetItem*) |
设置指定列的表头 |
setVerticalHeaderItem(int row, QTableWidgetItem*) |
设置指定行的表头 |
QTableWidgetItem信号:
| 信号 | 说明 |
|---|---|
cellClicked(int row, int column) |
点击单元格时触发 |
cellDoubleClicked(int row, int column) |
双击单元格时触发 |
cellEntered(int row, int column) |
鼠标进入单元格时触发 |
currentCellChanged(int row, int column, int previousRow, int previousColumn) |
选中的单元格发生变化时触发,参数分别为当前单元格行号、当前单元格列号、之前单元格行号、之前单元格列号 |
整体来说还是挺好理解的,直接来看如何去使用QTableWidget:
ui图形化界面操作
- 在左侧控件中找到
TableWidget,拖拽到中间界面上 - 双击(或者右键,点击编辑项目)即可进入到编辑界面
- 选择行、列进行增加和删除操作;选择表格设置每一个单元格的值
- 通过代码新增行、列、设置单元格的中的文本
使用代码新增行、列时就要注意:setHorizontalHeaderItem 设置指定列的表头 和setVerticalHeaderItem 设置指定行的表头
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 插入2行
ui->tableWidget->insertRow(0);
ui->tableWidget->insertRow(1);
// 插入2列
ui->tableWidget->insertColumn(0);
ui->tableWidget->insertColumn(1);
// 设置行标题
//QTableWidgetItem* vitem1 = new QTableWidgetItem();
//vitem1->setText("1");
//QTableWidgetItem* vitem2 = new QTableWidgetItem();
//vitem2->setText("2");
//ui->tableWidget->setVerticalHeaderItem(0,vitem1);
//ui->tableWidget->setVerticalHeaderItem(1,vitem2);
ui->tableWidget->setVerticalHeaderItem(0,new QTableWidgetItem("1"));
ui->tableWidget->setVerticalHeaderItem(1,new QTableWidgetItem("2"));
// 设置列标题
QTableWidgetItem* hitem1 = new QTableWidgetItem();
hitem1->setText("学号");
QTableWidgetItem* hitem2 = new QTableWidgetItem();
hitem2->setText("姓名");
ui->tableWidget->setHorizontalHeaderItem(0,hitem1);
ui->tableWidget->setHorizontalHeaderItem(1,hitem2);
}
这里也可以设置表格中的文本属性、对齐方式、缩进等。
- 用户输入文本,通过点击新增/删除按钮 来新增一行/列、删除一行/列
预期效果:

通过输入行/列名,点击添加行/列,完成新增行/列的效果;
选择某行/列,点击删除行/列,完成删除行/列的效果
cpp
void Widget::on_pushButton_addrow_clicked()
{
// 新增一行
QString text = ui->lineEdit->text();
if(text == "")
return;
int row = ui->tableWidget->currentRow();
if(row == -1) //默认在最后新增
row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);
QTableWidgetItem* row_item = new QTableWidgetItem(text);
ui->tableWidget->setVerticalHeaderItem(row,row_item);
}
void Widget::on_pushButton_addcol_clicked()
{
QString text = ui->lineEdit->text();
if(text == "")
return;
int col = ui->tableWidget->currentColumn();
if(col == -1)
col = ui->tableWidget->columnCount();
ui->tableWidget->insertColumn(col);
QTableWidgetItem* col_item = new QTableWidgetItem(text);
ui->tableWidget->setHorizontalHeaderItem(col,col_item);
}
void Widget::on_pushButton_subrow_clicked()
{
int row = ui->tableWidget->currentRow();
if(row == -1)
return;
ui->tableWidget->removeRow(row);
}
void Widget::on_pushButton_subcol_clicked()
{
int col = ui->tableWidget->currentColumn();
if(col == -1)
return;
ui->tableWidget->removeColumn(col);
}
3. QTreeWidget
QTreeWidget表示属性结构控件
实际效果:
其中的每个元素都是一个 QTreeWidgetItem,而每一个QTreeWidgetItem还可以有子元素。
**QTreeWidget**中方法:
| 方法 | 说明 |
|---|---|
clear() |
清空所有子节点 |
addTopLevelItem(QTreeWidgetItem* item) |
新增顶层节点 |
topLevelItem(int index) |
获取指定下标的顶层节点 |
topLevelItemCount() |
获取顶层节点个数 |
indexOfTopLevelItem(QTreeWidgetItem* item) |
查询指定节点是顶层节点中的下标 |
takeTopLevelItem(int index) |
删除指定的顶层节点,返回 QTreeWidgetItem* 表示被删除的元素 |
currentItem() |
获取到当前选中的节点,返回 QTreeWidgetItem* |
setCurrentItem(QTreeWidgetItem* item) |
选中指定节点 |
setExpanded(bool) |
展开 / 关闭节点 |
setHeaderLabel(const QString& text) |
设置 TreeWidget 的 header 名称 |
只是看QTreeWidget的方法,我们可以发现:QTreeWidget提供的方法都是对顶层节点进行操作的(新增、删除、修改)
在QTreeWidget每一个元素都是一个QTreeWidgetItem对象,QTreeWidgetItem中的方法:
| 方法 | 说明 |
|---|---|
addChild(QTreeWidgetItem* child) |
新增子节点 |
childCount() |
子节点的个数 |
child(int index) |
获取指定下标的子节点,返回 QTreeWidgetItem* |
takeChild(int index) |
删除对应下标的子节点 |
removeChild(QTreeWidgetItem* child) |
删除对应的子节点 |
parent() |
获取该元素的父节点 |
所以,在实际操作过程当中,调用QTreeWidget提供的方法来新增、删除顶层元素。
而构建子树结构,就要通过调用对应 QTreeWidgetItem对象 的addCHild、removeChild等方法来新增、删除、修改子元素。
QTreeWidget中核心信号:
| 信号 | 说明 |
|---|---|
currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* old) |
切换选中元素时触发 |
itemClicked(QTreeWidgetItem* item, int col) |
点击元素时触发 |
itemDoubleClicked(QTreeWidgetItem* item, int col) |
双击元素时触发 |
itemEntered(QTreeWidgetItem* item, int col) |
鼠标进入时触发 |
itemExpanded(QTreeWidgetItem* item) |
元素被展开时触发 |
itemCollapsed(QTreeWidgetItem* item) |
元素被折叠时触发 |
QTreeWidget的使用
- 图形化界面操作
- 在左侧控件中找到
TreeWidget,拖拽到中间界面上 - 双击(或者右键,点击编辑项目)即可进入到编辑界面
- 新增/删除列,在项目设置中新增节点;双击节点设置其中的文本内容

- 通过代码创建顶层节点,构建树形结构
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//构建树形结构
QTreeWidgetItem* item1 = new QTreeWidgetItem();
QTreeWidgetItem* item2 = new QTreeWidgetItem();
QTreeWidgetItem* item3 = new QTreeWidgetItem();
QTreeWidgetItem* item4 = new QTreeWidgetItem();
QTreeWidgetItem* item5 = new QTreeWidgetItem();
QTreeWidgetItem* item6 = new QTreeWidgetItem();
QTreeWidgetItem* item7 = new QTreeWidgetItem();
QTreeWidgetItem* item8 = new QTreeWidgetItem();
QTreeWidgetItem* item9 = new QTreeWidgetItem();
item1->setText(0,"M4A1-星象"); // 当前只有第0列
item2->setText(0,"AK47-奉先");
item3->setText(0,"M200-权");
item4->setText(0,"COP-星象");
item5->setText(0,"USP-仁德");
item6->setText(0,"柯尔特-仲达");
item7->setText(0,"方天画戟");
item8->setText(0,"雌雄双股剑");
item9->setText(0,"青龙偃月刀");
// 顶层节点
QTreeWidgetItem* top1 = new QTreeWidgetItem();
QTreeWidgetItem* top2 = new QTreeWidgetItem();
QTreeWidgetItem* top3 = new QTreeWidgetItem();
top1->setText(0,"主武器");
top2->setText(0,"副武器");
top3->setText(0,"近战武器");
// 设置子节点
top1->addChild(item1);
top1->addChild(item2);
top1->addChild(item3);
top2->addChild(item4);
top2->addChild(item5);
top2->addChild(item6);
top3->addChild(item7);
top3->addChild(item8);
top3->addChild(item9);
// 将顶层节点添加到 QTreeWidget 控件中
ui->treeWidget->addTopLevelItem(top1);
ui->treeWidget->addTopLevelItem(top2);
ui->treeWidget->addTopLevelItem(top3);
}
可以看到,这里构建整个树形结构还是挺麻烦的。
- 用户输入,通过点击按钮完成顶层节点、子节点的创建和删除
cpp
void Widget::on_pushButton_addtop_clicked()
{
QString text = ui->lineEdit->text();
if(text == "")
return;
// 创建对象时指明父元素
QTreeWidgetItem* top = new QTreeWidgetItem(ui->treeWidget);
top->setText(0,text);
}
void Widget::on_pushButton_additem_clicked()
{
QString text = ui->lineEdit->text();
if(text == "")
return;
QTreeWidgetItem* now = ui->treeWidget->currentItem();
if(now == nullptr)
return;
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0,text);
now->addChild(item);
}
void Widget::on_pushButton_sub_clicked()
{
QTreeWidgetItem* item = ui->treeWidget->currentItem();
if(item == nullptr)
return;
QTreeWidgetItem* parent = item->parent();
if(parent == nullptr) // 顶层元素
ui->treeWidget->takeTopLevelItem(ui->treeWidget->indexOfTopLevelItem(item));
else
parent->removeChild(item);
}
到这里,我们就能够感受到:
QTreeWidget :只负责顶层元素;要添加、删除顶层元素就调用 **QTreeWidget**提供的方法。
要对其他元素进行添加和删除操作,就必须使用 **QTreeWidgetItem**提供的addChild、removeChild这些添加和删除子元素的方法了。
容器类控件
1. QGroupBox
QGroupBox 实现一个带有标题的分组框,这样将其他控件放到里面作为一组:

| 属性 | 说明 |
|---|---|
| title | 分组框的标题 |
| alignment | 分组框内部内容的对齐方式 |
| flat | 是否是 "扁平" 模式 |
| checkable | 是否可选择。设为 true,则在 title 前方会多出一个可勾选的部分 |
| checked | 描述分组框的选择状态(前提是 checkable 为 true) |
这里可以使用ui文件,将控件拖拽到对应的QGroupBox中;也可以通过代码创建QGroupBox,然后调用addWidget方法向分组中添加控件。
2. QTabWidget
QTabWidget,标签页,可以向里面添加一些控件。
| 属性 | 说明 |
|---|---|
tabPosition |
标签页所在的位置: North:上方;South:下方; West:左侧; East:右侧 |
currentIndex |
当前选中了第几个标签页(从 0 开始计算) |
currentTabText |
当前选中的标签页的文本 |
currentTabName |
当前选中的标签页的名字 |
currentTabIcon |
当前选中的标签页的图标 |
currentTabToolTip |
当前选中的标签页的提示信息 |
tabsCloseable |
标签页是否可以关闭 |
movable |
标签页是否可以移动 |
| 信号 | 说明 |
|---|---|
currentChanged(int) |
在标签页发生切换时触发,参数为被点击的选项卡编号 |
tabBarClicked(int) |
在点击选项卡的标签条的时候触发,参数为被点击的选项卡编号 |
tabBarDoubleClicked(int) |
在双击选项卡的标签条的时候触发,参数为被点击的选项卡编号 |
tabCloseRequest(int) |
在标签页关闭时触发,参数为被关闭的选项卡编号 |
示例:通过点击按钮,来创建/删除标签页

cpp
void Widget::on_pushButton_add_clicked()
{
QTabWidget* tab = new QTabWidget();
int count = ui->tabWidget->count();
QLabel* label = new QLabel(tab);
label->setText("标签页 " + QString::number(count + 1));
ui->tabWidget->addTab(tab,"tab" + QString::number(count + 1));
}
void Widget::on_pushButton_sub_clicked()
{
int index = ui->tabWidget->currentIndex();
if(index == -1)
return;
ui->tabWidget->removeTab(index);
}
布局类控件
在之前的操作中,都是我们手动(图形化界面拖拽、代码设置控件大小位置)调整这些控件。
在 Qt 当中提供了布局类控件,可以帮我们管理这些控件,并按照特定的形式显示出来。
1. 垂直布局
QVBoxLayout 表示垂直方向上布局管理器。(Vertical,垂直)
| 属性 | 说明 |
|---|---|
layoutLeftMargin |
左侧边距 |
layoutRightMargin |
右侧边距 |
layoutTopMargin |
上方边距 |
layoutBottomMargin |
下方边距 |
layoutSpacing |
相邻元素之间的间距 |
示例:使用QVBoxLayout管理多个控件

cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QVBoxLayout* layout = new QVBoxLayout();
this->setLayout(layout);
QPushButton* button1 = new QPushButton("按钮一");
QPushButton* button2 = new QPushButton("按钮二");
QPushButton* button3 = new QPushButton("按钮三");
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
}
2. 水平布局
QHBoxLayout 水平布局管理器,和垂直布局类似
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QHBoxLayout* layout = new QHBoxLayout();
this->setLayout(layout);
QPushButton* button1 = new QPushButton("按钮一");
QPushButton* button2 = new QPushButton("按钮二");
QPushButton* button3 = new QPushButton("按钮三");
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
}

嵌套布局:
上述操作都是在一个布局中直接管理控件;但是在实际开发过程中,往往都需要在一个布局中再嵌套其他布局使用。
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QHBoxLayout* hlayout = new QHBoxLayout();
this->setLayout(hlayout);
QPushButton* button1 = new QPushButton("按钮一");
QPushButton* button2 = new QPushButton("按钮二");
hlayout->addWidget(button1);
hlayout->addWidget(button2);
QLabel* label1 = new QLabel("文本一");
QLabel* label2 = new QLabel("文本二");
label1->setFrameShape(QLabel::Box);
label2->setFrameShape(QLabel::Box);
QVBoxLayout* vlayout = new QVBoxLayout();
vlayout->addWidget(label1);
vlayout->addWidget(label2);
hlayout->addLayout(vlayout);
}
3. 网格布局
除了上述的 QVBoxLayout和 QHBoxLayout 布局之外,Qt还提供了网格布局 QGridLayout
| 属性 | 说明 |
|---|---|
layoutLeftMargin |
左侧边距 |
layoutRightMargin |
右侧边距 |
layoutTopMargin |
上⽅边距 |
layoutBottomMargin |
下⽅边距 |
layoutHorizontalSpacing |
相邻元素之间⽔平⽅向的间距 |
layoutVerticalSpacing |
相邻元素之间垂直⽅向的间距 |
layoutRowStretch |
行方向的拉伸系数 |
layoutColumnStretch |
列方向的拉伸系数 |
示例:使用QGridLayout布局,管理4个按钮
首先,创建出四个按钮;然后调用addWidget方法,添加控件到布局管理器中并设置下标(第几行第几列)
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton* button1 = new QPushButton("按钮一");
QPushButton* button2 = new QPushButton("按钮二");
QPushButton* button3 = new QPushButton("按钮三");
QPushButton* button4 = new QPushButton("按钮四");
QGridLayout* layout = new QGridLayout();
this->setLayout(layout);
layout->addWidget(button1,0,0);
layout->addWidget(button2,0,1);
layout->addWidget(button3,1,0);
layout->addWidget(button4,1,1);
}
当然,这里如果设置所有控件都在同一行,那就和水平布局一样了;
如果设置所有控件都在同一列,那就和垂直布局一样的。
示例:设置拉伸系数
对于拉伸系数:Stretch这个属性,简单来说就是布局管理器中,每一个控件所占的比例大小。
例如:这里创建2*3的网格布局,列方向的拉伸系数设置成:1、2、3
cpp
layout->setColumnStretch(0,1); // 第0行占1份
layout->setColumnStretch(1,2); // 第1行占2份
layout->setColumnStretch(2,3); // 第2行占3份

当然也可以设置行方向的拉伸系数,但是这里按钮默认是进行垂直方向拉伸的;
所以设置了行方向的拉伸系数,可能没有任何效果(需要设置按钮的属性sizePolicy)

cpp
// 设置按钮水平、垂直方向均运行拉伸
button1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

4. 表单布局
QFormLayout,表单布局可以说是一种特殊的网格布局(只有2列)
QFormLayout常用与让用户输入信息的场景中:
示例:创建表单布局,设置文本框和输入框
创建QFormLayout对象, 调用addRow来添加控件:
其中
addRow方法的第一个参数是固定的:QLabel/文本第二个参数:
QWidget*可以是任意控件
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QLabel* label1 = new QLabel("姓名");
QLabel* label2 = new QLabel("学号");
QLabel* label3 = new QLabel("电话");
QFormLayout* layout = new QFormLayout();
this->setLayout(layout);
QLineEdit* lineedit1 = new QLineEdit();
QLineEdit* lineedit2 = new QLineEdit();
QLineEdit* lineedit3 = new QLineEdit();
layout->addRow(label1,lineedit1);
layout->addRow(label2,lineedit2);
layout->addRow(label3,lineedit3);
QPushButton* button = new QPushButton("点击提交");
layout->addRow(nullptr,button); // nullptr表示没有第一列
}

5. 空白
上述操作中,都是没有给控件之间设置空白的,这样看起来就会非常的紧凑;
这里也可以在控件和控件之间添加空白
| 属性 | 说明 |
|---|---|
| width | QSpacerItem 的固定宽度(水平方向空白的基础尺寸,配合 hData 生效) |
| height | QSpacerItem 的固定高度(垂直方向空白的基础尺寸,配合 vData 生效) |
| hData | 水平方向的尺寸策略(控制水平方向空白的拉伸 / 收缩行为) |
| vData | 垂直方向的尺寸策略(控制垂直方向空白的拉伸 / 收缩行为) |
-
QSizePolicy::Ignored:忽略预设的width值,不对水平布局的空间分配产生任何影响(空白宽度由布局自动分配,设置的 width 无效) -
QSizePolicy::Minimum:水平空白的最小宽度为预设的width,布局时宽度不会小于该值(仅允许保持或大于 width,不允许缩小) -
QSizePolicy::Maximum:水平空白的最大宽度为预设的width,布局时宽度不会大于该值(仅允许保持或小于 width,不允许拉伸) -
QSizePolicy::Preferred:水平空白的理想宽度为预设的width,布局时优先维持该尺寸;空间不足时可适当缩小,空间充足时可轻微拉伸(平衡灵活性与固定尺寸需求) -
QSizePolicy::Expanding:水平空白可灵活拉伸 / 收缩,会主动抢占布局中剩余的水平空间,实现 "推挤" 其他控件的效果(如将按钮靠右 / 靠左对齐)-- | ------------------------------------------------------------ |
| width | QSpacerItem 的固定宽度(水平方向空白的基础尺寸,配合 hData 生效) |
| height | QSpacerItem 的固定高度(垂直方向空白的基础尺寸,配合 vData 生效) |
| hData | 水平方向的尺寸策略(控制水平方向空白的拉伸 / 收缩行为) |
| vData | 垂直方向的尺寸策略(控制垂直方向空白的拉伸 / 收缩行为) |
-
QSizePolicy::Ignored:忽略预设的width值,不对水平布局的空间分配产生任何影响(空白宽度由布局自动分配,设置的 width 无效) -
QSizePolicy::Minimum:水平空白的最小宽度为预设的width,布局时宽度不会小于该值(仅允许保持或大于 width,不允许缩小) -
QSizePolicy::Maximum:水平空白的最大宽度为预设的width,布局时宽度不会大于该值(仅允许保持或小于 width,不允许拉伸) -
QSizePolicy::Preferred:水平空白的理想宽度为预设的width,布局时优先维持该尺寸;空间不足时可适当缩小,空间充足时可轻微拉伸(平衡灵活性与固定尺寸需求) -
QSizePolicy::Expanding:水平空白可灵活拉伸 / 收缩,会主动抢占布局中剩余的水平空间,实现 "推挤" 其他控件的效果(如将按钮靠右 / 靠左对齐) -
QSizePolicy::Shrinking:水平空白优先缩小以适配布局空间,仅在布局空间充足时才保持预设的width(优先满足其他控件的尺寸需求)
本篇文章到这里就结束了,感谢支持
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws