布局,Layout,就是把各个控件放在合适的位置,占据适当大小的空间。
在Qt中,使用布局器QLayout进行布局,QLayout本质上是一个工具类。
1、它为我们自动计算各个控件的大小和位置
2、当父窗口调整时,它根据既定策略Policy来调整各个子窗口的大小和位置
两个常用的QLayout类:
1、QHBoxLayout:横向布局
2、QVBoxLayout:纵向布局
纵向布局:
V : Vertical,竖直方向上的
在纵向布局中,宽度信息被忽略,只关心它的高度
演示:
创建一个窗口MyWindow,包含一个QLineEdit 和一个 QPlainTextEdit,然后用QVBoxLayout进行托管
代码图下:
MyWindow.h:
#pragma once #include <QWidget> //添加头文件 #include <QVBoxLayout> #include <QLineEdit> #include <QPlainTextEdit> class MyWindow : public QWidget { Q_OBJECT public: MyWindow(QWidget *parent); ~MyWindow(); protected: QLineEdit* my_line_edit; QPlainTextEdit* my_text_edit; };
MyWindow.cpp:
#include "MyWindow.h" MyWindow::MyWindow(QWidget *parent) : QWidget(parent) { //创建子控件对象 my_line_edit = new QLineEdit(this); my_text_edit = new QPlainTextEdit(this); //创建布局器 QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(my_line_edit); layout->addWidget(my_text_edit); //使用布局器 this->setLayout(layout); } MyWindow::~MyWindow() { }
main.cpp:
#include "Test3_1a_11_27.h" #include "MyWindow.h" #include <QtWidgets/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); //Test3_1a_11_27 w; //w.show(); MyWindow w(NULL); w.resize(400, 300); w.move(100, 100); w.show(); return a.exec(); }
运行程序,这时候会发现2个子窗口呈纵向布局,并且占满了整个主窗口:
改变主窗口的大小,两个子窗口的大小也会随之改变:
这时发现一个问题:
QLineEdit类型的子窗口只会改变宽度,而高度永远是固定的,
而QPlainTextEdit类型的子窗口宽度、高度都会跟着改变。
原因在于,这两个不通类型窗口的行为方式(Policy)是不同的
下面简单介绍几个属性:
SizePolicy:
前面提到过,表示窗口的行为方式
用于描述一个窗口(Widget)被调整大小(resizing)时,采用的策略。
在QSizePolicy类中定义了七种策略:
Fixed:使用sizeHint,不能更大,不能更小
Minimum:不能小于sizeHint,可以更大,但不需要更大
Maximum:不得大于sizeHint,可以更小
Preferred:优先使用sizeHint,可大可小
Expanding:使用sizeHint,越大越好
MinimumExpanding:不得小于sizeHint,越大越好
Ignored:忽略sizeHint,越大越好
SizePolicy的几个相关的函数:
//获取当前的policy QSizePolicy QWidget::sizePolicy() const; //设置新的policy(整体策略) void setSizePolicy(QSizePolicy); //设置新的policy(横向策略,纵向策略) void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical);
(PS:现在可以解释前面那个问题了:QLineEdit 和 QPlainTextEdit的纵向Policy分别为Fixed和Expanding)
SizeHint:
表示窗口的推荐大小
注意这个大小仅仅是推荐大小而不是最终大小
最终的实际大小是由布局器(QLayout)通过行为方式(SizePolicy)决定的
SizeHint的相关函数:
//向布局器声明自己需要的空间大小(推荐的尺寸) virtual QSize sizeHint() const;
横向布局:
H:Horizontal,水平方向上的
在横向布局中,高度信息被忽略,只关心它的宽度
原文地址:http://zhweizhi.blog.51cto.com/10800691/1877155