1. 绝对定位及存在的问题
(1)直接在像素级指定各个组件的位置和大小
void QWidget::move(int x, int y)
void QWidget::resize(int w, int h);
(2)存在问题:组件的位置和大小无法自适应父窗口的变化
2. 布局管理器
(1)提供相关的类对界面组件进行布局管理
①能够自动排列窗口中的界面组件
②窗口变化后自动更新界面组件的大小
(2)QLayout是Qt中布局管理器的抽象基类
(3)通过继承QLayout实现了功能各异且互补的布局管理器
(4)Qt中可以根据需要自定义布局管理器
(5)布局管理器不是界面部件(不可见必性),而是界面部件的定位策略
(6)布局管理器可以相互嵌套,形成更加复杂的布局方式。布局嵌套几乎可以完成所有常用的界面布局。
(7)自定义布局类可以达到个性化界面布局的效果
3. QBoxLayout布局管理器
(1)以水平或垂直的方式管理界面
(2)QBoxLayout示意图
(3)QBoxLayout嵌套实例
【编程实验】绝对定位和布局管理器实例
//main.cpp
#include <QApplication> #include "Widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
//Widget.h
#ifndef _WIDGET_H_ #define _WIDGET_H_ #include <QWidget> #include <QPushButton> class Widget : public QWidget { Q_OBJECT private: QPushButton TestBtn1; QPushButton TestBtn2; QPushButton TestBtn3; QPushButton TestBtn4; void initControl(); //通过绝对定位 void testVBoxLayout(); //垂直布局 void testHBoxLayout(); //水平布局 void testVHBoxLayout(); //嵌套布局 public: Widget(QWidget* parent = 0); ~Widget(); }; #endif //_WIDGET_H_
//Widget.cpp
#include "Widget.h" #include <QBoxLayout> #include <QDebug> Widget::Widget(QWidget* parent):QWidget(parent), TestBtn1(this),TestBtn2(this),TestBtn3(this),TestBtn4(this) { TestBtn1.setText("Test Button 1"); TestBtn2.setText("Test Button 2"); TestBtn3.setText("Test Button 3"); TestBtn4.setText("Test Button 4"); //绝对定位 //initControl(); //存在问题:位置和大小不能随父窗口的变化而变化 //垂直布局 //testVBoxLayout(); //水平布局 //testHBoxLayout(); //嵌套布局 testVHBoxLayout(); } void Widget::initControl() { TestBtn1.move(20, 20); TestBtn1.resize(160, 30); TestBtn2.move(20, 70); TestBtn2.resize(160, 30); TestBtn3.move(20, 120); TestBtn3.resize(160, 30); TestBtn4.move(20, 170); TestBtn4.resize(160, 30); } void Widget::testVBoxLayout() { QVBoxLayout* layout = new QVBoxLayout(); //水平和垂直方向扩展 TestBtn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn1.setMinimumSize(160, 30); TestBtn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn2.setMinimumSize(160, 30); TestBtn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn3.setMinimumSize(160, 30); TestBtn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn4.setMinimumSize(160, 30); layout->setSpacing(10); //间距10 layout->addWidget(&TestBtn1); layout->addWidget(&TestBtn2); layout->addWidget(&TestBtn3); layout->addWidget(&TestBtn4); setLayout(layout);//设置到本Widget对象,让布局对象生效 } void Widget::testHBoxLayout() { QHBoxLayout* layout = new QHBoxLayout(); //水平和垂直方向扩展 TestBtn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn1.setMinimumSize(160, 30); TestBtn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn2.setMinimumSize(160, 30); TestBtn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn3.setMinimumSize(160, 30); TestBtn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn4.setMinimumSize(160, 30); layout->setSpacing(10); //间距10 layout->addWidget(&TestBtn1); layout->addWidget(&TestBtn2); layout->addWidget(&TestBtn3); layout->addWidget(&TestBtn4); setLayout(layout);//设置到本Widget对象,让布局对象生效 } void Widget::testVHBoxLayout() { QHBoxLayout* hLayout1 = new QHBoxLayout(); QHBoxLayout* hLayout2 = new QHBoxLayout(); QVBoxLayout* vLayout = new QVBoxLayout(); //水平和垂直方向扩展 TestBtn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn1.setMinimumSize(160, 30); TestBtn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn2.setMinimumSize(160, 30); hLayout1->setSpacing(10); hLayout1->addWidget(&TestBtn1); hLayout1->addWidget(&TestBtn2); TestBtn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn3.setMinimumSize(160, 30); TestBtn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); TestBtn4.setMinimumSize(160, 30); hLayout2->setSpacing(10); hLayout2->addWidget(&TestBtn3); hLayout2->addWidget(&TestBtn4); vLayout->setSpacing(10); //间距10 vLayout->addLayout(hLayout1); vLayout->addLayout(hLayout2); setLayout(vLayout);//设置到本Widget对象,让布局对象生效 } Widget::~Widget() { }
4. 小结
(1)绝对定位的布局方式无法自适应窗口的变化
(2)Qt提供了相关的类对界面组件进行布局管理
(3)Qt预定义了功能各异且互补的布局管理器
(4)布局管理器能够相互嵌套形成复杂的布局
时间: 2024-12-19 07:58:21