关键词:布局管理器、QLayout
、QBoxLayout
布局管理器、布局管理器的嵌套
1. 绝对定位
目前的GUI开发方式:绝对定位——直接在像素级指定各个组件的位置和大小
void QWidget::move(int x, int y)
void QWidget::resize(int w, int h)
问题:组件的位置和大小无法自适应父窗口的变化
解决方案: 布局管理器
2. 布局管理器
提供相关的类对界面组件进行布局管理
1) 能够自动排列窗口中的界面组件
2) 窗口变化后自动更新界面组件的大小QLayout
是Qt中布局管理器的抽象类-
通过继承
QLayout
实现了功能各异且互补的布局管理器
Qt中可以根据需要自定义布局管理器
布局管理器不是界面部件, 而是界面部件的定位策略
3. QBoxLayout
布局管理器
- 以水平或垂直的方式管理界面组件
void Layout::testVBoxLayout()
{
QVBoxLayout* layout = new QVBoxLayout(); // 定义layout
testBtn1.setText("Button 1");
testBtn1.setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Expanding); // 设置大小策略
testBtn1.setMinimumSize(160, 30); // 设置最小尺寸
testBtn2.setText("Button 2");
testBtn2.setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Expanding);
testBtn2.setMinimumSize(160, 30);
testBtn3.setText("Button 3");
testBtn3.setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Expanding);
testBtn3.setMinimumSize(160, 30);
testBtn4.setText("Button 4");
testBtn4.setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Expanding);
testBtn4.setMinimumSize(160, 30);
layout->addWidget(&testBtn1); // 为layout中添加组建
layout->addWidget(&testBtn2);
layout->addWidget(&testBtn3);
layout->addWidget(&testBtn4);
layout->setSpacing(30); // 设置组建间距离
setLayout(layout);
}
4. 布局管理器的嵌套
- 布局管理器可以相互嵌套,形成更加复杂的布局方式
1)布局嵌套几乎可以完成所有常用的界面布局
2) 自定义布局类可以达到个性化界面布局的效果 -
QBoxLayout
嵌套实例
void Widget::testVHBoxLayout()
{
QVBoxLayout* vLayout = new QVBoxLayout();
QHBoxLayout* hLayoutTop = new QHBoxLayout();
QHBoxLayout* hLayoutButtom = new QHBoxLayout();
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);
hLayoutTop->setSpacing(10);
hLayoutTop->addWidget(&TestBtn1);
hLayoutTop->addWidget(&TestBtn2);
hLayoutButtom->setSpacing(10);
hLayoutButtom->addWidget(&TestBtn3);
hLayoutButtom->addWidget(&TestBtn4);
vLayout->setSpacing(10);
vLayout->addLayout(hLayoutTop);
vLayout->addLayout(hLayoutButtom);
setLayout(vLayout);
}
5. 小结
- 绝对定位的布局方式无法自适应窗口的变化
- Qt提供了相关的类对界面组件进行布局管理
- Qt预定义了功能各异且互补的布局管理器
- 布局管理器能够相互嵌套形成复杂的布局
声明:此文章仅是本人在学习狄泰QT实验分析课程所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4