QT布局管理
QT的布局管理系统提供简单而强大的机制自动排列一个窗口中的部件、所有QWidget类子类的实例都可以使用布局管理器来管理位于其中的子部件,QWidget::setLayouyt()
函数可以在一个部件上应用布局管理器。一个部件应用布局管理器后会完成以下任务:
-
定位子部件
-
感知窗口默认大小
-
感知窗口最大最小
-
改变大小处理
-
当内容改变时自动更新
- 字体大小,文本或子部件的其他内容随之改变
- 隐藏或显示子部件
- 移除一个子部件
QLayout
属性 | 说明 |
---|---|
layoutName | 现在所使用的布局管理器的名称 |
layoutLeftMargin | 设置布局管理器到界面左边界的距离 |
layoutTopMargin | 设置布局管理器到界面上边界的距离 |
layoutRightMargin | 右边界 |
layoutBottomMargin | 下边界 |
layoutSpacing | 布局管理器各个子部件间的距离 |
layoutStretch | 伸缩因子 |
layoutSizeConstraint | 设置大小约束条件 |
QBoxLayout、基本布局管理器
基本布局管理器使子布局在水平方向或垂直方向排成一列,将所有空间分成一行盒子,然后将每个部件放入一个盒子中。
QHBoxLayout、水平布局管理器
QVBoxLayout、垂直布局管理器
QGridLayout、栅格布局管理器
栅格布局管理器将空间分隔成行和列,行和列的交叉处形成单元格,然后将部件放入确定的单元格中。
#include <QGridLayout>
QGridLayout * layout = new QGridLayout;
layout->addWidget(Btn, 0, 0, 1, 2);
//添加部件,从第1行第1列开始,占据1行2列
QPushButton *pButton = new QPushButton(this);
QLabel *pFirstPage= new QLabel(this);
QLabel *pSecondPage = new QLabel(this);
QLabel *pThirdPage = new QLabel(this);
m_pStackedLayout = new QStackedLayout();
pButton->setText(QStringLiteral("点击切换"));
pFirstPage->setText(QStringLiteral("一去丶二三里"));
pSecondPage->setText(QStringLiteral("青春不老,奋斗不止!"));
pThirdPage->setText(QStringLiteral("纯正开源之美,有趣、好玩、靠谱。。。"));
// 添加页面(用于切换)
m_pStackedLayout->addWidget(pFirstPage);
m_pStackedLayout->addWidget(pSecondPage);
m_pStackedLayout->addWidget(pThirdPage);
QVBoxLayout *pLayout = new QVBoxLayout();
pLayout->addWidget(pButton, 0, Qt::AlignLeft | Qt::AlignVCenter);
pLayout->addLayout(m_pStackedLayout);
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10);
setLayout(pLayout);
// 连接切换按钮信号与槽
connect(pButton, &QPushButton::clicked, this, &MainWindow::switchPage);
// 切换页面
void MainWindow::switchPage()
{
int nCount = m_pStackedLayout->count();
int nIndex = m_pStackedLayout->currentIndex();
// 获取下一个需要显示的页面索引
++nIndex;
// 当需要显示的页面索引大于等于总页面时,切换至首页
if (nIndex >= nCount)
nIndex = 0;
m_pStackedLayout->setCurrentIndex(nIndex);
}
QFormLayout、表单布局管理器
用来管理表格的输入部件及相关的标签,将它的子部件分为两列,左边是一些标签,右边是一些输入部件。
参考addRow()
QStackedLayout、栈布局管理器
addLayout()
将一个子布局管理器放入主布局。
设置部件大小
只要是继承自QWidget的类都有以下两个属性:
大小提示:siziHint()
保存部件的建议大小信息 ->通过函数可获取
最小大小提示:minimumSizeHint()
保存部件的建议最小大小信息 ->通过函数可获取
sizePolicy属性:
常量 | 描述 |
---|---|
QSizePolicy::Fixed | 只能使用sizeHint()提供的值,无法伸缩 |
QSizePolicy::Minimum | siziHint()提供的大小是最小的,部件可以被拉伸 |
QSizePolicy::Maximum | sizeHint()提供的是最大大小,部件可以被压缩 |
QSizePolicy::Preferred | sizeHint()提供的大小是最佳大小,可以拉伸可以压缩 |
QSizePolicy::Expanding | sizeHint()提供的是合适的大小,部件可以被压缩,不过更倾向于拉伸来获得更多的空间 |
QSizePolicy::MinimumExpanding | sizeHint()提供的大小是最小的,部件倾向于被拉伸来获取更多的空间 |
QSizePolicy::Ignored | sizeHint()的值被忽略,部件将尽可能的被拉伸来获取更多的空间 |
关于伸缩因子(stretch factor)的概念:在代码中,可以在使用布局管理器的addWidget()函数添加部件时,在第二个参数指定伸缩因子。2,1
约束顶层窗口大小、LayoutSizeConstraint
5个常量,类似于sizePolicy属性,在文档中查询使用。建议QLayout::SetNoConstraint 部件不被约束
可扩展窗口
一个窗口可能很多选项是扩充的,只在必要的时候显示出来,这是就可以使用一个按钮,用来隐藏或显示多余的内容。要实现可扩展窗口,就得使用布局管理的特征,当子部件隐藏时,布局管理器自动缩小,当子部件重新显示时,布局管理器再次放大。
void MyWidget::on_pushButton_toggled(bool checked)
{
ui -> textEdit -> setVisible(checked); //按完按钮显示
}
ui -> textEdit -> hide(); //隐藏