实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。作为一款成熟的 GUI 框架,Qt 提供了很多摆放控件的辅助工具(又称布局管理器或者布局控件),它们可以完成两件事:
- 自动调整控件的位置,包括控件之间的间距、对齐等;
- 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观。
总之借助布局管理器,我们无需再逐个调整控件的位置和大小,可以将更多的精力放在软件功能的实现上。
Qt 共提供了 5 种布局管理器,每种布局管理器对应一个类,分别是 QVBoxLayout(垂直布局)、QHBoxLayout(水平布局)、QGridLayout(网格布局)、QFormLayout(表单布局)和 QStackedLayout(分组布局),它们的继承关系如下图所示:
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
1. 盒子布局(QBoxLayout)
QBoxLayout:可以在水平方向或垂直方向上排列控件,分别派生了QHBoxLayout、QVBoxLayout子类。
水平/垂直布局跟盒子布局除了构造时的方向(LeftToRight、TopToBottom)不同外,其它均相同。
QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::Direction::LeftToRight);//盒子布局
QHBoxLayout* hlayout = new QHBoxLayout();//水平布局
QVBoxLayout* vlayout = new QVBoxLayout();//垂直布局
公有函数
函数 |
描述 |
void addLayout(QLayout* layout,int stretch = 0) |
将layout添加到框的末端,使用连续拉伸因子拉伸。 |
void addSpacerItem(QSpacerItem * spacerItem) |
将spaceeritem添加到该盒子布局的末尾,通常不使用这个函数,请使用addSpacing(int size) |
void addSpacerItem(QSpacerItem * spacerItem) |
添加一个大小为size的不可伸缩空间(QSpacerItem)到这个框布局的末尾 |
void addStretch(int stretch = 0) |
添加一个可伸缩空间(一个QSpacerItem),最小尺寸为零,拉伸因子stretch到这个框布局的末尾。 |
void addStretch(int stretch = 0) |
限制盒子的垂直尺寸最小为size |
void addWidget(QWidget* widget,int stretch = 0,Qt::Alignment alignment = 0) |
将小部件添加到此框布局的末尾,并使用拉伸因子拉伸和对齐对齐。 |
void setDirection(QBoxLayout::Direction direction) |
设置此布局的方向为direction。 |
void setSpacing(int spacing) |
设置小部件之间的间距 |
void setStretch(int index,int stretch) |
给index位置的控件设置拉伸因子stretch |
bool setStretchFactor(QWidget* widget,int stretch) bool setStretchFactor(QWidget* widget,int stretch) |
设置小部件的拉伸因子,如果在布局中发现小部件(不包括子布局),则返回true; 否则返回false。 |
void QLayout::setMargin(int margin) |
设置布局管理器中所有控件的外边距,上、下、左、右外边距的大小都为 margin。默认情况下,所有方向的外边距为 11 px。 |
void QLayout::setContentsMargins(int left, int top, int right, int bottom) |
设置布局管理器中所有控件的外边距,和 setMargin() 的区别是,此方法可以自定义上、下、左、右外边距的值。 |
下面来讲解QBoxLayout、QHBoxLayout、QVBoxLayout的使用。
- 盒子布局(QBoxLayout)
//创建需要布局的小部件
QLabel* nameLabel = new QLabel("name");
QLineEdit* nameEdit = new QLineEdit;
//创建布局
QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::LeftToRight); //从左到右
//QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::RightToLeft); //从右到左
//QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::TopToBottom); //从上到下
//QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::BottomToTop); //从下到上
//把小部件添加到布局
boxlayout->addWidget(nameLabel);
boxlayout->addWidget(nameEdit);
//给当前窗口设置布局
this->setLayout(boxlayout);
1.1 水平布局(QHBoxLayout)
QHBoxLayout:水平布局,在水平方向上排列控件,