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

多元素控件

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

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

  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**提供的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

相关推荐
2601_962885726 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen6 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
我可能是个假开发6 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
WL学习笔记7 小时前
日期类(C++)
开发语言·c++·日期类实现
谢亮_vipxieliang8 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛8 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
xxwl5858 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
code2cat12 小时前
Java进阶篇之AtomicMarkableReference:引用还在,标记已经改变
java·开发语言·cas·并发编程·逻辑删除
CappuccinoRose12 小时前
FormData数据处理
开发语言·前端·javascript·表单数据
Zguigo12 小时前
【CUDA8】第一个CUDA C++ Kernel --vector add
java·开发语言·c++