存在的问题
- 目前的 GUI 开发方式:绝对定位
- 问题:组件的位置和大小无法自适应窗口的变化
1、布局管理器(layout:布局)
— 能够自动排列窗口中的界面组件
— 窗口变化后自动更新界面组件的大小
QLayout
是 Qt 中布局管理器的抽象基类- 通过继承
QLayout
实现功能各异且互补的布局管理器 - Qt 中可以根据需要自定义布局管理器
- 布局管理器不是界面组件,而是界面部件的定位策略(在界面中不可见,是窗口的帮手)
2、介绍 QBoxLayout
布局管理器
— 以水平或垂直的方式管理界面组件
QVBoxLayout :长度在变化,高度没有变化
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
protected:
QPushButton Btn1;
QPushButton Btn2;
QPushButton Btn3;
QPushButton Btn4;
void init();
void testVBoxLayout();
void testHBoxLayout();
void testVHBoxLayout();
public:
Widget(QWidget *parent = nullptr);
~Widget();
};
#endif
Widget.cpp
#include "Widget.h"
#include <QLayout>
#include <QBoxLayout>
#include <QVBoxLayout>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent): QWidget(parent), Btn1(this), Btn2(this), Btn3(this), Btn4(this)
{
//init();
//testVBoxLayout();
//testHBoxLayout();
testVHBoxLayout();
}
void Widget::init()
{
Btn1.setText("Test Button 1");
Btn1.move(20,20);
Btn1.resize(140,30);
Btn2.setText("Test Button 2");
Btn2.move(20,70);
Btn2.resize(140,30);
Btn3.setText("Test Button 3");
Btn3.move(20,120);
Btn3.resize(140,30);
Btn4.setText("Test Button 4");
Btn4.move(20,170);
Btn4.resize(140,30);
}
void Widget::testVBoxLayout()
{
//这里的步骤在帮助文档里面都有
QVBoxLayout* layout = new QVBoxLayout(); //设置成垂直布局
Btn1.setText("Test Button 1");
Btn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); //设置尺寸为随窗口变化
Btn1.setMinimumSize(140, 30); //设置按钮的最小尺寸
Btn2.setText("Test Button 2");
Btn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Btn2.setMinimumSize(140, 30);
Btn3.setText("Test Button 3");
Btn3.setSizePolicy(QSizePolicy