QT:控件属性及常用控件(4)-----多元素控件、容器类控件、布局管理器


在此之前我们要看一看XXview和XXWidget之间的区别

文章目录

  • 一、多元素控件
    • [1. List Widget](#1. List Widget)
      • [通过List Widget生成一个可添加可删除的列表](#通过List Widget生成一个可添加可删除的列表)
    • [2. Table Widget](#2. Table Widget)
      • [通过Table Widget生成一个可添加可删除的表格](#通过Table Widget生成一个可添加可删除的表格)
    • [3. Tree Widget](#3. Tree Widget)
      • [通过Tree Widget生成一个可添加可删除的树形表](#通过Tree Widget生成一个可添加可删除的树形表)
  • 二、容器类控件
    • [1. GroupBox](#1. GroupBox)
    • [2. TabWidget](#2. TabWidget)
  • 三、布局管理器
    • [1. 垂直布局(QVBoxLayout)](#1. 垂直布局(QVBoxLayout))
    • [2. 水平布局(QHBoxLayout,布局管理器嵌套)](#2. 水平布局(QHBoxLayout,布局管理器嵌套))
    • [3. 网格布局(QGridLayout)](#3. 网格布局(QGridLayout))
    • [4. 表单布局(QFormLayout)](#4. 表单布局(QFormLayout))
    • [5. 空白(Spacer)](#5. 空白(Spacer))

一、多元素控件

1. List Widget

使⽤QListWidget 能够显⽰⼀个纵向的列表.每个选项都可以被选中.

属性 说明
currentRow 当前被选中的是第⼏⾏
count ⼀共有多少⾏
sortingEnabled 是否允许排序
isWrapping 是否允许换⾏
itemAlignment 元素的对⻬⽅式
selectRectVisible 被选中的元素矩形是否可⻅
spacing 元素之间的间隔

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

方法 说明
addItem(constQString&label),addItem(QListWidgetItem*item) 列表中添加元素
currentItem() 返回QListWidgetItem*表⽰当前选中的元素
setCurrentItem(QListWidgetItem*item) 设置选中哪个元素
setCurrentRow(introw) 设置选中第⼏⾏的元素
insertItem(constQString&label,introw), insertItem(QListWidgetItem*item,int row) 在指定的位置插⼊元素
item(introw) 返回QListWidgetItem*表⽰第row⾏的元素
takeItem(introw) 删除指定⾏的元素,返回QListWidgetItem*表⽰是哪个元素被删除了

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

信号 说明
currentItemChanged(QListWidgetItem* current,QListWidgetItem*old) 选中不同元素时会触发.参数是当前选中的元素和之前选中的元素
currentRowChanged(int) 选中不同元素时会触发.参数是当前选中元素的⾏数.
itemClicked(QListWidgetItem*item) 点击某个元素时触发
itemDoubleClicked(QListWidgetItem*item) 双击某个元素时触发
itemEntered(QListWidgetItem*item) ⿏标进⼊元素时触发

其可以直接在这里改变类型

通过List Widget生成一个可添加可删除的列表

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->listWidget->addItem("关羽");
    ui->listWidget->addItem("吕布");
    ui->listWidget->addItem("孙策");
    ui->listWidget->addItem("典韦");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_add_clicked()
{
    //获取文本内容
    const QString& text = ui->lineEdit->text();
    ui->listWidget->addItem(text);
}

void Widget::on_pushButton_remove_clicked()
{
    //获取被选中的元素是哪一个
    int row = ui->listWidget->currentRow();
    if(row < 0){
        return;
    }
    //按照行号删除元素
    ui->listWidget->takeItem(row);
}

void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    //通过槽函数感知变化
    if(current != nullptr){
        qDebug() << "当前选中的武将:" << current->text();
    }
    if(previous != nullptr){
        qDebug() << "上次选中的武将:" << previous->text();
    }
}

2. Table Widget

使⽤QTableWidget 表⽰⼀个表格控件.⼀个表格中包含若⼲⾏,每⼀⾏⼜包含若⼲列.表格中的每个单元格,是⼀个QTableWidgetItem 对象.

方法 说明
item(int row, int column) 根据⾏数列数获取指定的QTableWidgetItem*
setItem(int row, int column,QTableWidget*) 根据行数列数设置表格中的元素
currentItem() 返回被选中的元素QTableWidgetItem*
currentRow() 返回被选中元素是第⼏⾏
currentColumn() 返回被选中元素是第⼏列
row(QTableWidgetItem*) 获取指定item是第⼏⾏
column(QTableWidgetItem*) 获取指定item是第⼏列
rowCount() 获取⾏数
columnCount() 获取列数
insertRow(introw) 在第row⾏处插⼊新⾏
insertColumn(int column) 在第column列插⼊新列
removeRow(int row) 删除第row⾏
removeColumn(int column) 删除第column列
setHorizontalHeaderItem(int column,QTableWidget*) 设置指定列的表头
setVerticalHeaderItem(introw, QTableWidget*) 设置指定⾏的表头
row() 获取⾏数
column() 获取当前是第⼏列
setText(const QString&) 设置⽂本
setTextAlignment(int) 设置⽂本对⻬
setIcon(const QIcon&) 设置图标
setSelected(bool) 设置被选中
setSizeHints(const QSize&) 设置尺⼨
setFont(const QFont&) 设置字体

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

信号 说明
cellClicked(introw,intcolumn) 点击单元格时触发
cellDoubleClicked(introw,int column) 双击单元格时触发
cellEntered(introw,intcolumn) ⿏标进⼊单元格时触发
currentCellChanged(introw,int column,intpreviousRow,int previousColumn) 选中不同单元格时触发

通过Table Widget生成一个可添加可删除的表格

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //插入行
    ui->tableWidget->insertRow(0);
    ui->tableWidget->insertRow(1);
    ui->tableWidget->insertRow(2);
    //插入列
    ui->tableWidget->insertColumn(0);
    ui->tableWidget->insertColumn(1);
    ui->tableWidget->insertColumn(2);
    //给行取名字
    ui->tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("武将"));
    ui->tableWidget->setHorizontalHeaderItem(1,new QTableWidgetItem("阵营"));
    ui->tableWidget->setHorizontalHeaderItem(2,new QTableWidgetItem("是否为鼠辈"));
    //给列添加数据
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("关羽"));
    ui->tableWidget->setItem(0,1,new QTableWidgetItem("蜀国"));
    ui->tableWidget->setItem(0,2,new QTableWidgetItem("否"));
    ui->tableWidget->setItem(1,0,new QTableWidgetItem("吕布"));
    ui->tableWidget->setItem(1,1,new QTableWidgetItem("群雄"));
    ui->tableWidget->setItem(1,2,new QTableWidgetItem("否"));
    ui->tableWidget->setItem(2,0,new QTableWidgetItem("孙权"));
    ui->tableWidget->setItem(2,1,new QTableWidgetItem("吴国"));
    ui->tableWidget->setItem(2,2,new QTableWidgetItem("是"));

}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_addrow_clicked()
{
    //了解一共有多少行
    int hang = ui->tableWidget->rowCount();
    //在这一行后插入一行
    ui->tableWidget->insertRow(hang);
}

void Widget::on_removerow_clicked()
{
    //获取选中的行号
    int number = ui->tableWidget->currentRow();
    //删除这一行
    ui->tableWidget->removeRow(number);
}

void Widget::on_addcolumn_clicked()
{
    //获取一共有几列
    int lie = ui->tableWidget->columnCount();
    //在这一列后插入一列
    ui->tableWidget->insertColumn(lie);
    //设置列的内容
    const QString& text = ui->lineEdit->text();
    ui->tableWidget->setHorizontalHeaderItem(lie,new QTableWidgetItem(text));
}

void Widget::on_removecolumn_clicked()
{
    //获取当前列
    int lie = ui->tableWidget->currentColumn();
    ui->tableWidget->removeColumn(lie);
}

3. Tree Widget

使⽤QTreeWidget 表⽰⼀个树形控件.⾥⾯的每个元素,都是⼀个QTreeWidgetItem ,每个QTreeWidgetItem 可以包含多个⽂本和图标,每个⽂本/图标为⼀个列.可以给QTreeWidget 设置顶层节点(顶层节点可以有多个),然后再给顶层节点添加⼦节点,从⽽构成树形结构.

其没有根节点,是从根节点外的节点开始(即顶层节点!)

属性 说明
text 持有的⽂本
textAlignment ⽂本对⻬⽅式
icon 持有的图表
font ⽂本字体
hidden 是否隐藏
disabled 是否禁⽤
expand 是否展开
sizeHint 尺⼨⼤⼩
selected 是否选中

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

方法 说明
clear 清空所有⼦节点
addTopLevelItem(QTreeWidgetItem*item) 新增顶层节点
topLevelItem(intindex) 获取指定下标的顶层节点.
topLevelItemCount() 获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item) 查询指定节点是顶层节点中的下标
takeTopLevelItem(intindex) 删除指定的顶层节点.返回QTreeWidgetItem*表⽰被删除的元素
currentItem() 获取到当前选中的节点,返回QTreeWidgetItem*
setCurrentItem(QTreeWidgetItem*item) 选中指定节点
setExpanded(bool) 展开/关闭节点
setHeaderLabel(constQString&text) 设置TreeWidget的header名称.
addChild(QTreeWidgetItem*child) 新增⼦节点
childCount() ⼦节点的个数
child(intindex) 获取指定下标的⼦节点.返回QTreeWidgetItem*
takeChild(intindex) 删除对应下标的⼦节点
removeChild(QTreeWidgetItem* child) 删除对应的⼦节点
parent() 获取该元素的⽗节点

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

信号 说明
currentItemChanged(QTreeWidgetItem* current,QTreeWidgetItem*old) 切换选中元素时触发
itemClicked(QTreeWidgetItem*item,intcol) 点击元素时触发
itemDoubleClicked(QTreeWidgetItem*item, intcol) 双击元素时触发
itemEntered(QTreeWidgetItem*item,intcol) ⿏标进⼊时触发
itemExpanded(QTreeWidgetItem*item) 元素被展开时触发
itemCollapsend(QTreeWidgetItem*item) 元素被折叠时触发

基本使用方法可以在ui界面:

通过Tree Widget生成一个可添加可删除的树形表

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置根节点的名字
    ui->treeWidget->setHeaderLabel("三国");

    //顶层节点
    QTreeWidgetItem* item1 = new QTreeWidgetItem();
    item1->setText(0,"魏国");
    ui->treeWidget->addTopLevelItem(item1);
    QTreeWidgetItem* item2 = new QTreeWidgetItem();
    item2->setText(0,"蜀国");
    ui->treeWidget->addTopLevelItem(item2);
    QTreeWidgetItem* item3 = new QTreeWidgetItem();
    item3->setText(0,"吴国");
    ui->treeWidget->addTopLevelItem(item3);
    QTreeWidgetItem* item4 = new QTreeWidgetItem();
    item4->setText(0,"群雄");
    ui->treeWidget->addTopLevelItem(item4);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_addtop_clicked()
{
    //获取输入框的内容
    const QString& text = ui->lineEdit->text();
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(0,text);
    ui->treeWidget->addTopLevelItem(item);
}

void Widget::on_pushButton_addchild_clicked()
{
    //获取当前选中的节点
    QTreeWidgetItem* currentitem = ui->treeWidget->currentItem();
    if(currentitem == nullptr){
        return;
    }
    //获取输入框的内容
    const QString& text = ui->lineEdit->text();
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(0,text);
    currentitem->addChild(item);
}

void Widget::on_pushButton_remove_clicked()
{
    //获取到选中元素
    QTreeWidgetItem* currenttem = ui->treeWidget->currentItem();
    if(currenttem == nullptr){
        return;
    }
    //删除选中的元素,需要先得到父元素
    QTreeWidgetItem* parentsitem = currenttem->parent();//先获取父元素
    if(parentsitem == nullptr){
        //顶层元素
        int index = ui->treeWidget->indexOfTopLevelItem(currenttem);//获取是第几个顶层元素的下标
        ui->treeWidget->takeTopLevelItem(index);//删除节点
    }else{
        //子节点
        parentsitem->removeChild(currenttem);
    }
}

二、容器类控件

1. GroupBox

使⽤QGroupBox 实现⼀个带有标题的分组框.可以把其他的控件放到⾥⾯作为⼀组.这样看起来能更好看⼀点.

属性 说明
title 分组框的标题
alignment 分组框内部内容的对⻬⽅式
flat 是否是"扁平"模式
font ⽂本字体
checkable 是否可选择.设为true,则在title前⽅会多出⼀个可勾选的部分
checked 描述分组框的选择状态(前提是checkable为true)

🌰分组框只是⼀个⽤来"美化界⾯"这样的组件,并不涉及到⽤⼾交互和业务逻辑.属于"锦上添 花".

可以把其他的各种控件放到GroupBox中,这时候内部的控件的父元素就不是this了,而是GroupBox

之前我们使用下面的这种分组方式,有了GroupBox我们就能更好地实现分组了:

2. TabWidget

使⽤QTabWidget 实现⼀个带有标签⻚的控件,可以往⾥⾯添加⼀些widget.进⼀步的就可以通过标签⻚来切换

属性 说明
tabPosition 标签⻚所在的位置.
currentIndex 当前选中了第⼏个标签⻚(从0开始计算)
currentTabText 当前选中的标签⻚的⽂本
currentTabName 当前选中的标签⻚的名字
currentTabIcon 当前选中的标签⻚的图标
currentTabToolTip 当前选中的标签⻚的提⽰信息
tabsCloseable 标签⻚是否可以关闭
movable 标签⻚是否可以移动

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

信号 说明
currentChanged(int) 在标签⻚发⽣切换时触发,参数为被点击的选项卡编号.
tabBarClicked(int) 在点击选项卡的标签条的时候触发.参数为被点击的选项卡编号.
tabBarDoubleClicked(int) 在双击选项卡的标签条的时候触发.参数为被点击的选项卡编号.
tabCloseRequest(int) 在标签⻚关闭时触发.参数为被关闭的选项卡编号.
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //先在每个标签页中加一个label
    QLabel* label1 = new QLabel(ui->tab);
    label1->setText("第一页");
    label1->resize(200,400);

    QLabel* label2 = new QLabel(ui->tab_2);
    label2->setText("第二页");
    label2->resize(200,400);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    int count = ui->tabWidget->count();//获取标签页总数
    QWidget* w = new QWidget();
    ui->tabWidget->addTab(w,QString("第 ")+QString::number(count+1)+QString("页"));
    //添加label显示内容
    QLabel* label = new QLabel(w);//label在weidget上建立
    label->setText(QString("第 ")+QString::number(count+1)+QString("页"));
    label->resize(200,400);
    //设置新增标签页后,直接在新标签页上
    ui->tabWidget->setCurrentIndex(count);
}

void Widget::on_pushButton_2_clicked()
{
    int index = ui->tabWidget->currentIndex();
    ui->tabWidget->removeTab(index);
}

三、布局管理器

之前使⽤Qt在界⾯上创建的控件,都是通过"绝对定位"的⽅式来设定的.

也就是每个控件所在的位置,都需要计算坐标,最终通过setGeometry 或者move ⽅式摆放过去.

这种设定⽅式其实并不⽅便.尤其是界⾯如果内容⽐较多,不好计算.⽽且⼀个窗⼝⼤⼩往往是可以调整的,按照绝对定位的⽅式,也⽆法⾃适应窗⼝⼤⼩.因此Qt引⼊"布局管理器"(Layout)机制,来解决上述问题.

1. 垂直布局(QVBoxLayout)

使⽤QVBoxLayout 表⽰垂直的布局管理器.

属性 说明
layoutLeftMargin 左侧边距.
layoutRightMargin 右侧边距
layoutTopMargin 上⽅边距
layoutBottomMargin 下⽅边距
layoutSpacing 相邻元素之间的间距
cpp 复制代码
ui->setupUi(this);
    QPushButton* button1 = new QPushButton("按钮1");
    QPushButton* button2 = new QPushButton("按钮2");
    QPushButton* button3 = new QPushButton("按钮3");

    //创建布局管理器
    QVBoxLayout* layout = new QVBoxLayout();
    layout->addWidget(button1);
    layout->addWidget(button2);
    layout->addWidget(button3);
    //把布局管理器添加到窗口中
    this->setLayout(layout);

使用垂直布局管理器,他就会像这样自适应的垂直进行布局,并且布局会根据窗口的大小变化而变化!

但是每个widget中只能设置一个布局管理器。接下来我们看看怎么设置多个布局管理器!

设置多个布局管理器



2. 水平布局(QHBoxLayout,布局管理器嵌套)

使⽤QHBoxLayout 表⽰垂直的布局管理器。

属性 说明
layoutLeftMargin 左侧边距.
layoutRightMargin 右侧边距
layoutTopMargin 上⽅边距
layoutBottomMargin 下⽅边距
layoutSpacing 相邻元素之间的间距

使用方式和垂直布局一致,这里不再赘述!

布局管理器还可以进行嵌套,水平嵌套垂直,垂直嵌套水平!

cpp 复制代码
 ui->setupUi(this);
    //创建垂直布局管理器
    QVBoxLayout* vlayout = new QVBoxLayout();
    this->setLayout(vlayout);
    //添加垂直的三个按钮
    QPushButton* button1 = new QPushButton("按钮1");
    QPushButton* button2 = new QPushButton("按钮2");
    QPushButton* button3 = new QPushButton("按钮3");
    vlayout->addWidget(button1);
    vlayout->addWidget(button2);
    vlayout->addWidget(button3);

    //创建水平布局管理器
    QHBoxLayout* hlayout = new QHBoxLayout();
    //添加水平的两个按钮
    QPushButton* button4 = new QPushButton("按钮4");
    QPushButton* button5 = new QPushButton("按钮5");
    hlayout->addWidget(button4);
    hlayout->addWidget(button5);
    //把水平布局管理器添加到垂直布局管理器内部
    vlayout->addLayout(hlayout);

3. 网格布局(QGridLayout)

Qt 中还提供了QGridLayout ⽤来实现⽹格布局的效果.可以达到M*N的这种⽹格的效果.

整体和QVBoxLayout 以及QHBoxLayout 相似.但是设置spacing的时候是按照垂直⽔平两个⽅向来设置的.

属性 说明
layoutLeftMargin 左侧边距.
layoutRightMargin 右侧边距
layoutTopMargin 上⽅边距
layoutBottomMargin 下⽅边距
layoutHorizontalSpacing 相邻元素之间⽔平⽅向的间距
layoutVerticalSpacing 相邻元素之间垂直⽅向的间距
layoutRowStretch ⾏⽅向的拉伸系数
layoutColumnStretch 列⽅向的拉伸系数
cpp 复制代码
QPushButton* button1 = new QPushButton("按钮1");
    QPushButton* button2 = new QPushButton("按钮2");
    QPushButton* button3 = new QPushButton("按钮3");
    QPushButton* button4 = new QPushButton("按钮4");
    QPushButton* button5 = new QPushButton("按钮5");
    QPushButton* button6 = new QPushButton("按钮6");
    QGridLayout* layout = new QGridLayout();
    layout->addWidget(button1,0,0);//(n,n)布局,(0,0)代表第一行第一列,以此类推
    layout->addWidget(button2,1,1);
    layout->addWidget(button3,2,2);
    layout->addWidget(button4,3,3);
    layout->addWidget(button5,4,1);
    layout->addWidget(button6,5,5);
    //如果你设置的很离谱比如:layout->addWidget(button6,100,100);那么QT也不会无脑那么设置,它会根据相对位置进行合理化
    this->setLayout(layout);

拉伸系数

水平拉伸系数:setColumnStretch()第一个参数为第几列,第二个参数为比例,设置为0表示不随窗口变化而变化

cpp 复制代码
 //设置水平拉伸系数
    layout->setColumnStretch(0,0);//第一个参数为第几列
    layout->setColumnStretch(1,1);//第二个参数为比例,设置为0表示不随窗口变化而变化
    layout->setColumnStretch(2,3);

垂直拉伸系数:

cpp 复制代码
 //设置垂直拉伸系数
    layout->setRowStretch(0,1);//第一个参数为第几行
    layout->setRowStretch(1,4);//第二个参数为比例,设置为0表示不随窗口变化而变化

我们发现其并没有按照我们的设置进行变化!!

这是为什么呢???
这是因为setSizePolicy,由于按钮垂直方向默认是没有拉开的(水平方向默认拉伸),因此垂直方向不会受到拉伸系数的影响,要想让垂直方向的拉伸系数生效,就需要让按钮能够拉伸展开!

使⽤setSizePolicy 设置按钮的尺⼨策略.可选的值如下:

QSizePolicy::Ignored 忽略控件的尺⼨,不对布局产⽣影响。

QSizePolicy::Minimum 控件的最⼩尺⼨为固定值,布局时不会超过该值。

QSizePolicy::Maximum :控件的最⼤尺⼨为固定值,布局时不会⼩于该值。

QSizePolicy::Preferred :控件的理想尺⼨为固定值,布局时会尽量接近该值。

QSizePolicy::Expanding 控件的尺⼨可以根据空间调整,尽可能占据更多空间。

QSizePolicy::Shrinking 控件的尺⼨可以根据空间调整,尽可能缩⼩以适应空间。

cpp 复制代码
//使其能够展开
    button1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    button2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    button3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    button4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    button5->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    button6->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    //设置垂直拉伸系数
    layout->setRowStretch(0,1);//第一个参数为第几行
    layout->setRowStretch(1,4);//第二个参数为比例,设置为0表示不随窗口变化而变化

4. 表单布局(QFormLayout)

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

这种表单布局多用于让用户填写信息的场景,左侧列为提示,右侧列为输入框。
其是一个N行2列的表格!

cpp 复制代码
  QFormLayout* layout = new QFormLayout();
   this->setLayout(layout);
   //创建label为第一列
   QLabel* label1 = new QLabel("学校");
   QLabel* label2 = new QLabel("学院");
   QLabel* label3 = new QLabel("专业");
   //创建输入框为第二列
   QLineEdit* edit1 = new QLineEdit();
   QLineEdit* edit2 = new QLineEdit();
   QLineEdit* edit3 = new QLineEdit();
   //把上述控件添加到表单布局
   layout->addRow(label1,edit1);
   layout->addRow(label2,edit2);
   layout->addRow(label3,edit3);

5. 空白(Spacer)

使⽤布局管理器的时候,可能需要在控件之间,添加⼀段空⽩.就可以使⽤QSpacerItem来表⽰.

属性 说明
width 宽度.
height ⾼度
hData ⽔平⽅向的sizePolicy
vData 垂直⽅向的sizePolicy
cpp 复制代码
 QHBoxLayout* layout = new QHBoxLayout();
   this->setLayout(layout);
   //创建label为第一列
   QLabel* label1 = new QLabel("学校");
   QLabel* label2 = new QLabel("学院");
   QLabel* label3 = new QLabel("专业");

   //创建spacer
   QSpacerItem* SPACER = new QSpacerItem(200,20);
   //把上述控件添加到表单布局
   layout->addWidget(label1);
   layout->addSpacerItem(SPACER);
   layout->addWidget(label2);
   layout->addWidget(label3);

同时其也可以在ui界面中直接添加:

相关推荐
简 洁 冬冬1 小时前
Java中的Servlet
java·开发语言·servlet
matlabgoodboy2 小时前
留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB
开发语言·后端·ruby
R三哥哥啊3 小时前
【Qt】06-对话框
开发语言·qt·microsoft·qt5
hefaxiang3 小时前
【C++】类和对象(一)
开发语言·c++
爱学习的大牛1234 小时前
安卓通过网络获取位置的方法
开发语言·android 网络定位
SomeB1oody5 小时前
【Rust自学】15.7. 循环引用导致内存泄漏
开发语言·后端·rust
graceyun5 小时前
C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】
c语言·开发语言·leetcode
PellyKoo5 小时前
Python网络爬虫中的编码乱码如何解决
开发语言·爬虫·python
一水鉴天5 小时前
为AI聊天工具添加一个知识系统 之74 详细设计之15 正则表达式 之2
开发语言·人工智能
go54631584655 小时前
python实现一个完整的智能教室能耗监测与管理系统的实现方案
开发语言·python