布局管理系统:
QLayout类是布局管理器的基类,是一个抽象基类,继承自QObject、QLayoutItem,QLayoutItem类提供了一个供QLayout操作的抽象项目。
常用的布局有四种:
Vertical Layout (QVBoxLayout) | 垂直布局 |
Horizontal Layout (QHBoxLayout) | 水平布局 |
Grid Layout (QGridLayout) | 网格布局 |
From Layout (QFormLayout) | 表单布局 |
布局中常用的方法:
setColumnStretch() | 设定列的占用比例 |
addStretch() | 添加一个占位符,使按钮的大小不会变化 |
setSizeConstraint() | 设定最优化显示,用户无法改变对话框大小 |
setDirection() | 可以设定布局的排列顺序 |
setSpaceing() | 设置部件间距 |
setContentMargins() | 设置外边距 |
垂直布局:
垂直布局,让布局里面的控件按照竖直方式排列
格式:
- 创建垂直布局 QVBoxLayout *VB=new QVBoxLayout;
- 布局中添加控件 VB->addWidget()
- 窗口中添加布局 Widget->setLayout(VB);
QWidget *widget=new QWidget();//添加一个窗口
widget->resize(500,500);//设置窗口大小
QPushButton *push1=new QPushButton("1",widget);
QPushButton *push2=new QPushButton("2",widget);
QPushButton *push3=new QPushButton("3",widget);
QPushButton *push4=new QPushButton("4",widget);
QPushButton *push5=new QPushButton("5",widget);
QVBoxLayout *hlay=new QVBoxLayout;//创建垂直布局
hlay->addWidget(push1);//添加控件
hlay->addWidget(push2);
hlay->addWidget(push3);
hlay->addWidget(push4);
hlay->addWidget(push5);
widget->setLayout(hlay);//窗口中添加布局
widget->show();
水平布局:
水平布局,让布局里面的控件按照水平方式排列
格式:
- 创建水平布局 QVBoxLayout *HB=new QVBoxLayout;
- 布局中添加 HB->addWidget()
- 窗口中添加布局 Widget->setLayout(HB);
QWidget *widget=new QWidget();//添加一个窗口
widget->resize(500,500);//设置窗口大小
QPushButton *push1=new QPushButton("1",widget);
QPushButton *push2=new QPushButton("2",widget);
QPushButton *push3=new QPushButton("3",widget);
QPushButton *push4=new QPushButton("4",widget);
QPushButton *push5=new QPushButton("5",widget);
QHBoxLayout *hlay=new QHBoxLayout;//创建水平布局
hlay->addWidget(push1);//添加控件
hlay->addWidget(push2);
hlay->addWidget(push3);
hlay->addWidget(push4);
hlay->addWidget(push5);
widget->setLayout(hlay);//窗口中添加布局
widget->show();//显示窗口
网格布局:
QGridLayout 占用提供给它的空间,将其划分为行和列,并将其管理的每个小部件放入正确的单元格中。
创建布局:
1.QGridLayout()
2.QGridLayout(QWidget *parent)设置父类 也可以通过 1 用 窗口->setLayout()来设置
打破布局:
~QGridLayout()
设置部件之间的间距
水平间距:setHorizontalSpacing(int spacing)
垂直间距:setVerticalSpacing(int spacing)
间距:setSpacing(int spacing)
设置外间距:QLayout::setContentsMargins(int left, int top, int right, int bottom)
添加控件:
void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
将 widget 控件添加到网格中的 (row,column) 位置处,并且可以自定义该控件的对齐方式。 void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
将 widget 控件从 (fromRow, fromColumn) 位置开始,跨 rowSpan 行和 ColumnSpan 列添加到网格中,并且可以自定义该控件的对齐方式。
添加布局:
void QGridLayout::addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void QGridLayout::addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
向网格中的 (row, column) 位置处添加 layout 布局管理器。
将 layout 布局管理器从 (row, column) 位置开始,跨 rowSpan 行和 ColumnSpan 列添加到网格中,并且可以自定义该布局控件的对齐方式。
其他成员方法:
rowCount() | 获取网格控件中的行数 |
columnCount() | 获取网格控件中的列数 |
setColumnStretch(int column, int stretch) | 给指定的 column 列设置伸缩系数 |
setRowStretch(int row, int stretch) | 给指定的 row 行设置伸缩系数。 |
setColumnMinimumWidth(int column, int minSize) | 设置 column 列的最小宽度。 |
setRowMinimumHeight(int row, int minSize) | 设置 row 行的最小宽度。 |
登录窗口:
QWidget *widget=new QWidget();
widget->resize(500,500);
QPushButton *p1=new QPushButton("登录",widget);
QPushButton *p2=new QPushButton("退出",widget);
QPushButton *p3=new QPushButton("注册账号",widget);
QPushButton *p4=new QPushButton("找回密码",widget);
QLabel *lab1=new QLabel("账号:",widget);
QLabel *lab2=new QLabel("密码:",widget);
QLineEdit *Lind1=new QLineEdit(widget);
QLineEdit *Lind2=new QLineEdit(widget);
//创建一个布局
QGridLayout *qgt=new QGridLayout;
//设置label大小
lab1->resize(40,20);
lab2->resize(40,20);
qgt->addWidget(lab1,0,0,1,1);// 账号: 第0行第0列 开始,占用1行1列
qgt->addWidget(Lind1,0,1,1,3);// 账号输入框 第0行第1列 开始,占用1行3列
qgt->addWidget(p3,0,5,1,1);// 注册账号 第0行第5列 开始,占用1行1列
qgt->addWidget(lab2,1,0,1,1); //密码: 第1行第0列 开始, 占用1行1列
qgt->addWidget(Lind2,1,1,1,3);// 账号输入框 第1行第1列 开始,占用1行3列
qgt->addWidget(p4,1,5,1,1); //找回密码 第1行第5列 开始,占用1行1列
//设置密码显示格式
Lind1->setEchoMode(QLineEdit::Password);
qgt->addWidget(p1,3,1); //登录 第3行第1列 开始, 占用1行1列
qgt->addWidget(p2,3,3); //退出 第3行第3列 开始, 占用1行1列
qgt->setHorizontalSpacing(10);//设置水平间距
qgt->setVerticalSpacing(10);//设置垂直间距
qgt->setContentsMargins(100,100,100,100);//设置外边距
widget->setLayout(qgt);
widget->show();
表单布局:
QFormLayout 只包含 2 列,且第一列通常放置第二列控件的标签
创建表单布局:
1.QFormLayout()
2.QFormLayout(父类)
添加表单:
1.
QFormLayout::addRow(QWidget *label, QWidget *field)
将一个新行添加到此窗体布局的底部,其中包含给定的标签和字段
addRow(const QString &labelText, QWidget *field)
后台创建一个 QLabel,并将 labelText 作为其文本。该字段被设置为新的 QLabel 的伙伴
将指定的 field 控件和 labelText 描述信息添加到表单控件的末尾。
addRow(const QString &labelText, QLayout *field)
可以在表单中添加布局
设置标签和字段的位置 :
setRowWrapPolicy(QFormLayout::RowWrapPolicy policy)
QFormLayout::DontWrapRows | 字段始终位于其标签旁边。这是除 Qt 扩展样式之外的所有样式的默认策略。 |
QFormLayout::WrapLongRows | 为标注提供足够的水平空间以适合最宽的标注,其余空间则分配给字段。如果字段对的最小大小大于可用空间,则该字段将换行到下一行。这是 Qt 扩展样式的默认策略。 |
QFormLayout::WrapAllRows | 字段始终位于其标签下方。 |
QFormLayout::insertRow(int row, const QString &labelText, QWidget *field) | 将指定的 field 控件和 labelText 描述信息插入到表单控件中指定行的位置。 |
QFormLayout::removeRow(int row) 如果要从布局中删除行而不删除小部件,请改用 takeRow() | 删除表单控件中的指定行。 |
QFormLayout::removeRow(QWidget *widget) | 删除表单控件中 widget 控件所在的行。 |
设置间距:
水平间距:setHorizontalSpacing(int spacing)
垂直间距:setVerticalSpacing(int spacing)
间距:setSpacing(int spacing)
设置外间距:QLayout::setContentsMargins(int left, int top, int right, int bottom)
其他成员函数:
QLayoutItem *QFormLayout::itemAt(int row, QFormLayout::ItemRole role) const | 返回给定行中具有指定角色(列)的布局项。如果没有此类项目,则返回。nullptr |
QFormLayout *qft=new QFormLayout;//添加布局
QLineEdit *line1=new QLineEdit(widget);//设置两个LineEdit
QLineEdit *line2=new QLineEdit(widget);
qft->addRow("账号:",line1);
qft->addRow("密码;",line2);
widget->setLayout(qft);
QPushButton *p1=new QPushButton("登录",widget);
QPushButton *p2=new QPushButton("退出",widget);
qft->addRow(p1,p2);
qft->setVerticalSpacing(50);//设置垂直间距
qft->setContentsMargins(100,100,100,100);//设置外间距
设置部件大小:
- sizeHint 保存了部件的建议大小(不同部件不同)
- minimumSizeHint 保存了一个建议的最小大小提示
sizeHint() | 获取sizeHint的值 |
minimumSizeHint() | 获取minimumSizeHint的值 |
setMinimumSizeHint() | 可以修改部件的最小大小,最小大小提示会失效 |
QHBoxLayout *layout=new QHBoxLayout(this);
QLabel *lab1=new QLabel("控件一");
QLabel *lab2=new QLabel("控件二");
layout->addWidget(lab1);
layout->addWidget(lab2);
qDebug()<<lab1->sizeHint();//建议的值
qDebug()<<lab1->minimumSizeHint();//建议的最小大小
QSizePolicy(大小策略)
使用函数setSizePolicy()设置
QSizePolicy::Fixed | 只能使用sizeHint()提供的大小 |
QSizePolicy::Minimum | sizeHint()提供的大小是最小的,部件可以被拉伸 |
QSizePolicy::Maximum | sizeHint()提供的大小是最大的,部件可以被拉伸 |
QSizePolicy::Preferred | sizeHint()提供的大小是最佳大小,部件可以被压缩或拉伸 |
QSizePolicy::Expanding | sizeHint()提供的大小是合适大小,可以被压缩,但倾向于被拉伸 |
QSizePolicy::MinimumExpanding | sizeHint()提供的大小是最小的,部件倾向于被拉伸 |
QSizePolicy::Ignored | sizeHint()提供的大小被忽略,部件尽可能拉伸获得空间 |
在ui界面中:
stretch factor(伸缩因子)
伸缩因子的作用:用来设置部件比例。
使用函数:setStrechFactor()来设置伸缩因子
可扩展窗口:
一个窗口可能有很多选项是扩充的,只有在必要时才显现出来,这样就可以使用一个按钮来隐藏或者显示多余的内容。
setVisible(bool) 可以使控件隐藏
例子:在界面中
把Widget放到页面中并添加两个按钮并水平布局
然后添加一个垂直布局,在里面放入Widget和一个textEdit
在构造函数中实现功能:
ui->textEdit->setVisible(false);//默认为隐藏
connect(ui->pushButton,&QPushButton::clicked,[=]()
{
ui->textEdit->setVisible(true);
});
connect(ui->pushButton_2,&QPushButton::clicked,[=]()
{
ui->textEdit->setVisible(false);
});
默认为隐藏:
点击显示后:
点击隐藏后: