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

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

时间: 2024-12-12 17:39:14

【Qt学习笔记】3.布局的相关文章

Qt学习笔记-Widget布局管理

Qt学习笔记4-Widget布局管理 以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,finddialog.h,finddialog.cpp及main.cpp. //finddialog.h代码 #ifndef FINDDIALOG_H#define FINDDIALOG_H #include <QDialog> class QCheckBox;class QLabel;class QLineE

QT学习笔记_布局

布局大致分水平布局,竖直布局 ,网格布局等等.. #include <QApplication> #include <QHBoxLayout>//布局 #include <QSlider>//滑块 #include <QSpinBox>//微调框 #include <QLabel>//标签 int main(int argc,char *argv[]) { QApplication app(argc,argv); QWidget *w=new Q

【Qt学习笔记】2.窗体Widget && 屏幕坐标 && 布局

一.窗体 在Qt中,把窗体(口)叫做Widget. Widget可以是主窗体(口),也可以是依附在主窗体(口)上的各种控件,作为子窗体,这两种窗口,分别称作顶级窗口(top-level widget)和子窗口(sub widget). 顶级窗口:一个标准的窗口,带边框.标题栏.若干按钮.(独立) 子窗口:在窗口里面的窗口,例如:按钮.文本框等控件.(不独立,随着父窗口移动) 注意: 1.每个子窗口都有一个父窗口 2.子窗口里面可能包含了若干子窗口,是一层一层的关系. 3.顶级窗口也有父窗口:就是

QT学习笔记(1)

采用QT创建一个GUI的应用程序时,都必须包含一个QApplication的对象,而对于非GUI的QT程序,可以使用不依赖QtGui库的QApplication QT的主要类: QLable                   标签类 QPushButton          按钮类 QVBoxLayout          竖布局管理器类 QHBoxLayout          横布局管理器类 QWidget                 窗口部件类 QGridLayout        

【Qt学习笔记】13.拖放技术:Drag & Drop

1.接受拖放 Drag & Drop 是一个界面操作,用于在两个窗口间传递数据. Drag Source: 拖放源窗口 Drag Target: 拖放目标窗口 拖放操作: 1.在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag) 2.在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop) (按下ESC取消操作) MIME: MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0,

QT学习笔记—1

1.模态和非模态的区别:非模态可以同时操作两个窗口,模态的只能在顶层窗口关闭之后才能使用其他窗口 //同时显示出widget和dialog窗口,非模态     QDialog *dialog = new QDialog(this);     dialog->show(); //同时显示出widget和dialog窗口,模态     QDialog *dialog = new QDialog(this);     dialog->setModal(true);     dialog->sh

DuiLib学习笔记4——布局

有了前面三篇的基础,现在可以开始布局了. 首先任何布局都必须包含在<Window></Window>标签内,跟<html></html>很像. DuiLib提供了两种布局方式,水平布局和垂直布局,虽然没有css左右浮动那么方便,但是有这些东西,完全可以像写页面table一样去完成. 水平布局是HorizontalLayout,垂直布局为VerticalLayout.在Window标签内,默认的是垂直布局. 下面来看一段代码,包含了水平和垂直布局. <?

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏,主机是mini2440,分辨率是800*480,程序写比較粗糙,但对刚開始学习的人还是有一点启示,大家一起进步. qt中提供了QGphicsView,QGraphicsScene,QGraphicsItem,QGraphicsPixmapItem是QGraphicsItem的子类 分辨创建它们的实

【Qt学习笔记】1.初步接触

一.前言 Qt是一个跨平台的C++图形面向对象的框架,今天开始学习并记录学习过程,希望通过这段时间的努力学会Qt的使用. 同时我也希望在学习的过程中对C++的各种特性有能深刻的认识. 此外,我在Qt初步的学习过程中,所用的环境应该是 VS2015 IDE 二.安装 官网下载Qt安装包和 Qt for VS addin,分别安装,并配置. 三.Hello World 接下来用Qt框架来完成第一个程序 首先打开VS,创建一个Qt工程 熟悉的C++界面,但Qt是有可视化界面的,点击解决方案管理器中的.