原文链接:
Qt学习之路14--布局管理器(QGridLayout)_qtwidgets.qgridlayout()setspacing(0)-CSDN博客
1.Qt布局介绍
Qt 窗口布局是指将多个子窗口按照某种排列方式将其全部展示到对应的父窗口中的一种处理方式。在 Qt 中常用的布局样式有三种,分别是:
-
水平布局:布局中的所有的控件水平排列
-
垂直布局:布局中的所有的控件垂直排列
-
栅格布局:布局中的所有的控件垂直 + 水平排列
2. UI窗口布局
3. API设置布局
3.1 QLayout
// 在布局最后面添加一个窗口 void QLayout::addWidget(QWidget *w); // 将某个窗口对象从布局中移除, 窗口对象如果不再使用需要自己析构 void QLayout::removeWidget(QWidget *widget); // 设置布局的四个边界大小, 即: 左、上、右和下的边距。 void QLayout::setContentsMargins(int left, int top, int right, int bottom); // 设置布局中各个窗口之间的间隙大小 void setSpacing(int);
3.2 QHBoxLayout
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { //在QMaindow布局 ui->setupUi(this); QWidget* w=new QWidget; setCentralWidget(w); //设置中心窗口,通常一个程序只有一个中心窗口 QHBoxLayout* hlayout=new QHBoxLayout; QPushButton* b1=new QPushButton("1"); QPushButton* b2=new QPushButton("2"); QPushButton* b3=new QPushButton("3"); hlayout->addWidget(b1); hlayout->addWidget(b2); hlayout->addWidget(b3); centralWidget()->setLayout(hlayout); }
3.2 QVBoxLayout
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QWidget* w=new QWidget; setCentralWidget(w); QVBoxLayout* hlayout=new QVBoxLayout; QPushButton* b1=new QPushButton("1"); QPushButton* b2=new QPushButton("2"); QPushButton* b3=new QPushButton("3"); hlayout->addWidget(b1); hlayout->addWidget(b2); hlayout->addWidget(b3); centralWidget()->setLayout(hlayout); }
3.3 QGridLayout
由于网格布局管理器中的组件也是会随着窗口拉伸而发生变化的,所以也是需要设置组件之间的比例系数的,与QBoxLayout不同的是,网格布局管理器需要分别设置行和列的比例系数
layout->setRowStretch(int row, int stretch);//设置行比例系数 layout->setColumnStretch(int column, int stretch);//设置列比例系数
3.3.1 QGridLayout使用 ,通过四个按钮体验一下使用QGridLayout。
QGridLayout* layout = new QGridLayout(); TestBtn1.setText("Test Button 1"); TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);//设置组件大小可扩展 TestBtn1.setMinimumSize(160, 30);//设置最小尺寸 TestBtn2.setText("Test Button 2"); TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); TestBtn2.setMinimumSize(160, 30); TestBtn3.setText("Test Button 3"); TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); TestBtn3.setMinimumSize(160, 30); TestBtn4.setText("Test Button 4"); TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); TestBtn4.setMinimumSize(160, 30); layout->setSpacing(10);//设置间距 layout->addWidget(&TestBtn1, 0, 0);//往网格的不同坐标添加不同的组件 layout->addWidget(&TestBtn2, 0, 1); layout->addWidget(&TestBtn3, 1, 0); layout->addWidget(&TestBtn4, 1, 1); layout->setRowStretch(0, 1);//设置行列比例系数 layout->setRowStretch(1, 3); layout->setColumnStretch(0, 1); layout->setColumnStretch(1, 3); setLayout(layout);//设置顶级布局管理器
3.3 .2 addwidget 重载
3.3.3 嵌套
使用嵌套布局管理器的套路和之前的QBoxLayout是一样的,只是顶级布局管理器不光是管理组件,还要管理别的布局管理器。
QGridLayout* layout = new QGridLayout(); QVBoxLayout* vlayout = new QVBoxLayout(); /*中间省略不是太关键的五个按钮属性设置相关代码*/ layout->setSpacing(10);//设置按钮之间的距离 //将编号为123的按钮加到网格布局管理器 layout->addWidget(&TestBtn1, 0, 0); layout->addWidget(&TestBtn2, 0, 1); layout->addWidget(&TestBtn3, 1, 0); //将编号为45的按钮加到垂直布局管理器 vlayout->addWidget(&TestBtn4); vlayout->addWidget(&TestBtn5); //布局管理器嵌套 layout->addLayout(vlayout,1, 1); setLayout(layout);
3.3.4 QGridLayouut 总结
-
QGridLayout以网格的形式对组件进行定位
-
QGridLayout中的组件可以根据需要设置跨越多个网格
-
QGridLayout支持比例系数的概念,比例系数决定了组件的相对大小