一、手动布局

布局,Layout,就是把各个控件放在合适的位置,占据适当大小的空间。

在Qt中,使用布局器QLayout进行布局,QLayout本质上是一个工具类。

1、它为我们自动计算各个控件的大小和位置

2、当父窗口调整时,它根据既定策略Policy来调整各个子窗口的大小和位置

两个常用的QLayout类:

1、QHBoxLayout:横向布局

2、QVBoxLayout:纵向布局

(1)纵向布局:

V : Vertical,竖直方向上的

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

演示:

创建一个窗口MyWindow,包含一个QLineEdit 和一个 QPlainTextEdit,然后用QVBoxLayout进行托管

代码图下:

MyWindow.h:

#pragma once#include <QWidget>//添加头文件
#include <QVBoxLayout>
#include <QLineEdit>
#include <QPlainTextEdit>class MyWindow : public QWidget
{Q_OBJECTpublic: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;

(2)横向布局:

H:Horizontal,水平方向上的

在横向布局中,高度信息被忽略,只关心它的宽度,其他要注意的同上

做一个有关手动布局的小练习:

使用学过的QPushButton、QLineEidt、QPlainTextEdit,结合布局器QHBoxLayout、QVBoxLayout,做一个简单的如下图所示的界面

代码如下:

/*练习:手动布局*/my_line_edit = new QLineEdit(this);my_text_edit = new QPlainTextEdit(this);my_button = new QPushButton(this);my_button->setText("Button");QHBoxLayout* layout_h = new QHBoxLayout();layout_h->addWidget(my_line_edit);layout_h->addWidget(my_button);QVBoxLayout* layout_v = new QVBoxLayout();layout_v->addLayout(layout_h);     //addLayout: 将整个布局器作为窗体托管给另一个布局器layout_v->addWidget(my_text_edit);this->setLayout(layout_v); //使用布局器,注意别忘了

二、可视化布局(Visual Layout)

截止到目前我们使用的布局方式都是传统的纯代码风格的手动布局

但是,当要设计的窗口比较复杂时,使用手动布局会变得非常麻烦,甚至难以实现。

因此 Qt框架下通常采用可视化布局的方式,使用设计器(Qt Designer)进行布局

这里定义窗体类,采用QtGuiClass:

创建完成后,在工程中向之前那样,增加了刚添加的 .h 和 .cpp 文件,此外,还增加了一个.ui文件,双击它,就可以打开Qt Designer工具,进行可视化设计了。

Qt Designer工具的Widget Box中有所有可用的控件,拖动即可添加,选中若干控件,屏幕正上方有之前介绍的布局器(Layout),可以进行水平、竖直方向上的组合以及拆散,如下图:

/***************************************************************

注意:使用设计器布局,最后要对整个Widget设置一下Layout

注意:使用设计器布局,最后要对整个Widget设置一下Layout

注意:使用设计器布局,最后要对整个Widget设置一下Layout

(方法:点空白位置,或在对象查看器中选中主窗口,设置Layout)

***************************************************************/

使用上面的提到的方法,可以快速设计一个之前做过的界面:

可视化布局代码生成的过程:

这时候,编译,会发现多了一个ui_xxxxxxx.h的头文件:

该文件就是我们之前用设计器所做布局的代码实现,接下来就解释一下具体的过程。

还是刚刚的界面,用文本的格式打开MyWindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MyWindow</class><widget class="QWidget" name="MyWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>281</width><height>247</height></rect></property><property name="windowTitle"><string>MyWindow</string></property><layout class="QVBoxLayout" name="verticalLayout"><item><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QLineEdit" name="lineEdit"/></item><item><widget class="QPushButton" name="pushButton"><property name="text"><string>PushButton</string></property></widget></item></layout></item><item><widget class="QPlainTextEdit" name="plainTextEdit"/></item></layout></widget><layoutdefault spacing="6" margin="11"/><resources/><connections/>
</ui>

这其实是一个xml文件,描述了我们所设计的窗体中的一切要素。

编译步骤:

1、界面布局,保存为*.ui

2、*.ui -> ui_*.h  (用编译程序uic进行转换)

3、启动C++的常规编译步骤

三、更多的布局参数

前面已经介绍过2个重要的布局参数:

size hint:     推荐大小

size policy:   策略

接下来再介绍一些同样重要的参数:

stretch factor:  拉伸因子

maximun size:   大小上限(0 ~ FFFFFF)

minimum size:   大小下限(0 ~ FFFFFF)

stretch factor(拉伸因子)

在同一方向上,如果两个控件都有拉伸的需求(比如说它们的Policy都设置成Expanding),那么就需要考虑它们的拉伸因子。

举个例子,当两个Policy为Expanding的控件的stretch为1时,那么当放大窗口,这两个控件所分配的多余的空间之比为 1:1

尾巴:

这次基本上没什么要说的了 =  =

转载于:https://blog.51cto.com/zhweizhi/1877155

【Qt学习笔记】3.布局相关推荐

  1. QT学习笔记(十四):QLayout的属性介绍

    QT学习笔记(十四):QLayout的属性介绍 主要包括QBoxLayout.和QGridLayout以及QFormLayout等的参数类似. 我主要说明一下QGridLayout在QtDesigne ...

  2. Qt 学习笔记(5)绘图 五子棋游戏

    在上一篇博客C++ Qt学习笔记(4)绘图中介绍了Qt中的绘图方法,基于上一篇的博客的知识,使用QPainter设计一个五子棋的棋盘,后续会完成五子棋的游戏设计. 1. 棋盘的设计 首先需要绘制棋盘的 ...

  3. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

  4. 【QT学习笔记】基于QT的天气预报

    [QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...

  5. QT 学习笔记(六)

    文章目录 一.设计器的使用 二.常用控件 1. Containers 容器类 2. Input Widgets 输出控件 3. Display Widgets 显示类控件 三.代码和运行结果 1. 主 ...

  6. Qt学习笔记,Qt国际化

    Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\     ...

  7. Qt学习笔记,Qt程序架构设计要旨

    Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...

  8. Qt学习笔记之MySQL数据库

    一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...

  9. Qt学习笔记之数据库

    一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...

  10. Qt学习笔记之文件处理

    Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...

最新文章

  1. 屠榜多目标跟踪!华科amp;港大提出ByteTrack:基于数据关联方法BYTE的跟踪器
  2. java命令查看 java.io.tmpdir 参数值
  3. 视频云的全景蓝图,想象力的允诺之地
  4. 你的Wi-Fi 还安全吗?全球重大漏洞WPA2 KRACK 详细分析报告
  5. ubunut16.04解决网速慢的办法
  6. 调查谋杀案以换取Obra Dinn
  7. 牛客网——最简真分数
  8. JVM原理探究及调优方法论
  9. 数据结构-树2-二叉树各种函数实现
  10. python3 pygame 坦克自动移动
  11. html中倒计时精确到毫秒,倒计时功能 精确到毫秒
  12. 网站建设软件—***系统(DianCMS)1.0 发布
  13. [ArcGIS] 模型构造器中使用重分类 ArcPy与Numpy 相等间隔重分类
  14. 亚马逊防关联方法适合shopee平台吗?
  15. 计算机毕业设计、课程设计之[含论文+源码等]S2SH+mysql的报刊订阅系统[包运行成功]
  16. 阿里云ESC搭建SVN服务端-----实测有效,并补充了一些坑点
  17. 奉子成婚,永远不可能成为潮流
  18. python def函数调用_Python - def 函数
  19. java容器doc_java容器组件
  20. DVD区域码相关知识

热门文章

  1. flash传值给javascript,并在html页面输出,javascript向flash swf文件传递参数值注意细节...
  2. 对于新安装的MySQL如何提升MySQL的安全级别
  3. zabbix分布式监控环境搭建
  4. 1.1 学习之初;1.2 约定;1.3 认识Linux;1.4 创建虚拟机;1.5安装centos7
  5. 快速搭建Web环境 Angularjs + Express3 + Bootstrap3
  6. 3.0 mysql配置讲解
  7. 移植qt5.3.1到arm
  8. 使用C++11封装线程池ThreadPool
  9. weblogic domain creation
  10. win8 附件数据库失败解决方案《1》