QT布局管理

QT布局管理

QT的布局管理系统提供简单而强大的机制自动排列一个窗口中的部件、所有QWidget类子类的实例都可以使用布局管理器来管理位于其中的子部件,QWidget::setLayouyt()函数可以在一个部件上应用布局管理器。一个部件应用布局管理器后会完成以下任务:

  1. 定位子部件

  2. 感知窗口默认大小

  3. 感知窗口最大最小

  4. 改变大小处理

  5. 当内容改变时自动更新

    1. 字体大小,文本或子部件的其他内容随之改变
    2. 隐藏或显示子部件
    3. 移除一个子部件

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(); //隐藏
原文地址:https://www.cnblogs.com/liunian1004/p/5909928.html