【Qt学习笔记】3.布局
一、手动布局
布局,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.布局相关推荐
- QT学习笔记(十四):QLayout的属性介绍
QT学习笔记(十四):QLayout的属性介绍 主要包括QBoxLayout.和QGridLayout以及QFormLayout等的参数类似. 我主要说明一下QGridLayout在QtDesigne ...
- Qt 学习笔记(5)绘图 五子棋游戏
在上一篇博客C++ Qt学习笔记(4)绘图中介绍了Qt中的绘图方法,基于上一篇的博客的知识,使用QPainter设计一个五子棋的棋盘,后续会完成五子棋的游戏设计. 1. 棋盘的设计 首先需要绘制棋盘的 ...
- QT学习笔记(摘抄)
QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...
- 【QT学习笔记】基于QT的天气预报
[QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...
- QT 学习笔记(六)
文章目录 一.设计器的使用 二.常用控件 1. Containers 容器类 2. Input Widgets 输出控件 3. Display Widgets 显示类控件 三.代码和运行结果 1. 主 ...
- Qt学习笔记,Qt国际化
Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\ ...
- Qt学习笔记,Qt程序架构设计要旨
Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...
- Qt学习笔记之MySQL数据库
一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...
- Qt学习笔记之数据库
一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...
- Qt学习笔记之文件处理
Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...
最新文章
- 屠榜多目标跟踪!华科amp;港大提出ByteTrack:基于数据关联方法BYTE的跟踪器
- java命令查看 java.io.tmpdir 参数值
- 视频云的全景蓝图,想象力的允诺之地
- 你的Wi-Fi 还安全吗?全球重大漏洞WPA2 KRACK 详细分析报告
- ubunut16.04解决网速慢的办法
- 调查谋杀案以换取Obra Dinn
- 牛客网——最简真分数
- JVM原理探究及调优方法论
- 数据结构-树2-二叉树各种函数实现
- python3 pygame 坦克自动移动
- html中倒计时精确到毫秒,倒计时功能 精确到毫秒
- 网站建设软件—***系统(DianCMS)1.0 发布
- [ArcGIS] 模型构造器中使用重分类 ArcPy与Numpy 相等间隔重分类
- 亚马逊防关联方法适合shopee平台吗?
- 计算机毕业设计、课程设计之[含论文+源码等]S2SH+mysql的报刊订阅系统[包运行成功]
- 阿里云ESC搭建SVN服务端-----实测有效,并补充了一些坑点
- 奉子成婚,永远不可能成为潮流
- python def函数调用_Python - def 函数
- java容器doc_java容器组件
- DVD区域码相关知识
热门文章
- flash传值给javascript,并在html页面输出,javascript向flash swf文件传递参数值注意细节...
- 对于新安装的MySQL如何提升MySQL的安全级别
- zabbix分布式监控环境搭建
- 1.1 学习之初;1.2 约定;1.3 认识Linux;1.4 创建虚拟机;1.5安装centos7
- 快速搭建Web环境 Angularjs + Express3 + Bootstrap3
- 3.0 mysql配置讲解
- 移植qt5.3.1到arm
- 使用C++11封装线程池ThreadPool
- weblogic domain creation
- win8 附件数据库失败解决方案《1》