QT布局管理器 Layout,如何实现窗口最大化时,控件也随着变大。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT布局管理器 Layout,如何实现窗口最大化时,控件也随着变大。相关的知识,希望对你有一定的参考价值。

如图,左侧是QTreeView,右侧是QListView。设置布局后,控件会随着窗口变大而变大。但是设置布局后,两个窗口就变的一样大了。我想让左侧小,右侧大。
在线等。。。

参考技术A 你的空间需要自己绘制,然后获得窗口改变后的宽度和高度的变化比率,让你的控件以相应的比例变化就OK了追问

不太明白,能加下QQ吗?
822410717

追答

参考技术B 你可以用QGridLayout(网格)这个布局,网格布局可以使控件具体化,每个控件都给布局到网格中了 参考技术C 要么加Spacer

要么你就用GridLayout,设置span追问

能加QQ聊下吗?822410717

本回答被提问者采纳

Qt学习笔记3.布局

布局,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,水平方向上的

在横向布局中,高度信息被忽略,只关心它的宽度

以上是关于QT布局管理器 Layout,如何实现窗口最大化时,控件也随着变大。的主要内容,如果未能解决你的问题,请参考以下文章

Qt学习四 - 布局管理器

Qt designer 怎样使用 layout 控制布局, 可以实现 随着窗口的拉大拉小,部件也随着变大变小啊。。

QT中控件如何随着窗口大小的改变而使它充满整个窗口空间

QT 布局管理器在移动窗口之前隐藏小部件时不会恢复空间

Qt之自定义布局管理器(QFlowLayout)

Qt-布局管理器