【QT(八)】—— 常用控件(五)

多元素控件

常见的多元素空间:QListView/QListWidgetQTableView/QTableWidgetQTreeView/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

  1. 图形化界面操作

使用ui文件、图形化界面操作还是非常方便的:

  • 在左侧控件中找到ListWidget,拖拽到中间界面上
  • 双击(或者右键,点击编辑项目)即可进入到编辑界面
  • 点击下方+新增一行,选择指定行再点击-删除选中行
  1. 通过代码添加元素

还是先通过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在指定行插入,表示插入元素插入后是第几行(不是在第几行后面插入

  1. 用户输入文本,通过点击新增/删除按钮来控制和删除元素

这里就实现三个按钮:

  • 新增元素:在最后一行新增元素
  • 当前行新增:在选中行新增元素
  • 删除元素:删除指定行元素
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

  1. ui 图形化界面操作
  • 在左侧控件中找到TableWidget,拖拽到中间界面上
  • 双击(或者右键,点击编辑项目)即可进入到编辑界面
  • 选择行、列进行增加和删除操作;选择表格设置每一个单元格的值
  1. 通过代码新增行、列、设置单元格的中的文本

使用代码新增行、列时就要注意: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);
}

这里也可以设置表格中的文本属性、对齐方式、缩进等。

  1. 用户输入文本,通过点击新增/删除按钮 来新增一行/列、删除一行/列

预期效果

通过输入行/列名,点击添加行/列,完成新增行/列的效果;

选择某行/列,点击删除行/列,完成删除行/列的效果

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对象 的addCHildremoveChild等方法来新增、删除、修改子元素。

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的使用

  1. 图形化界面操作
  • 在左侧控件中找到TreeWidget,拖拽到中间界面上
  • 双击(或者右键,点击编辑项目)即可进入到编辑界面
  • 新增/删除列,在项目设置中新增节点;双击节点设置其中的文本内容
  1. 通过代码创建顶层节点,构建树形结构
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);
}

可以看到,这里构建整个树形结构还是挺麻烦的。

  1. 用户输入,通过点击按钮完成顶层节点、子节点的创建和删除
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**提供的addChildremoveChild这些添加和删除子元素的方法了。

容器类控件

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. 网格布局

除了上述的 QVBoxLayoutQHBoxLayout 布局之外,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

相关推荐
期待のcode2 小时前
Java虚拟机的垃圾回收器
java·开发语言·jvm·算法
星火开发设计2 小时前
C++ 分支结构:if-else 与 switch-case 的用法与区别
开发语言·c++·学习·算法·switch·知识·分支
qq_406176142 小时前
深耕JS防抖与节流:从原理到工程化实践的全方位指南
开发语言·php
2301_797312262 小时前
学习Java40天
java·开发语言·学习
Two_brushes.2 小时前
C++ 常见特殊类的设计(含有单例模式)
开发语言·c++
不会c嘎嘎2 小时前
QT -- 窗口
开发语言·qt
LawrenceLan2 小时前
Flutter 零基础入门(二十一):Container、Padding、Margin 与装饰
开发语言·前端·flutter·dart
lsx2024062 小时前
C++ 注释
开发语言
黎雁·泠崖2 小时前
Java初识面向对象+类与对象+封装核心
java·开发语言