广告
返回顶部
首页 > 资讯 > 后端开发 > Python >【Qt学习笔记】3.布局
  • 529
分享到

【Qt学习笔记】3.布局

学习笔记布局Qt 2023-01-31 04:01:49 529人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

一、手动布局布局,Layout,就是把各个控件放在合适的位置,占据适当大小的空间。在Qt中,使用布局器QLayout进行布局,QLayout本质上是一个工具类。1、它为我们自动计算各个控件的大小和位置2、当父窗口调整时,它根据既定策略Pol

一、手动布局

布局,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_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个子窗口呈纵向布局,并且占满了整个主窗口:

wKioL1g7AzSBHGZdAAANeojCKYQ597.png

改变主窗口的大小,两个子窗口的大小也会随之改变:

wKiom1g7AzXjV_2EAAAio78VOrk650.png

wKioL1g7AzXDrn5qAAAXD0mBHMI309.png


这时发现一个问题:

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,做一个简单的如下图所示的界面

wKiom1g8GvjCzR5tAAANkS5R2J0584.png


代码如下:


	
	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:

wKiom1g8H33gMTVoAAB8uyQCQMs587.png

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


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

wKioL1g8I3PCKAjUAAArjZArwrY043.png




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

wKiom1g8JOyiuFpZAAAX95igIao556.png



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

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

wKiom1g8JSHSLvvJAABleKIwMv0399.png

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

还是刚刚的界面,用文本的格式打开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




尾巴:

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


--结束END--

本文标题: 【Qt学习笔记】3.布局

本文链接: https://www.lsjlt.com/news/187882.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【Qt学习笔记】3.布局
    一、手动布局布局,Layout,就是把各个控件放在合适的位置,占据适当大小的空间。在Qt中,使用布局器QLayout进行布局,QLayout本质上是一个工具类。1、它为我们自动计算各个控件的大小和位置2、当父窗口调整时,它根据既定策略Pol...
    99+
    2023-01-31
    学习笔记 布局 Qt
  • 学习笔记3
    一文件查找和压缩1文件查找locate 搜索依赖于数据库,非实时搜索,搜索新建文件需手动更新,适于搜索稳定不频繁修改文件 find 实时搜索,精确搜索,默认当前目录递归搜索 find用法 -maxdepth...
    99+
    2023-01-31
    学习笔记
  • 学习笔记(3)
    1.* 匹配零个或多个字符(通配符中)2.ls 的-d选项不仅仅可以显示指定目录的信息,还可以用来表示不递归子文件夹。  # ls -dl /etc 显示/etc目录的信息  # ls -d /etc 只显示/etc下面的文件夹3.显示/v...
    99+
    2023-01-31
    学习笔记
  • Flutter学习笔记(三)RowColum布局
    目录主题开发环境源码开发过程主题 本文将介绍,flutter中的row,colum的用法。通俗来说,就是横向布局和纵向布局的用法。 开发环境 win10androidstudio20...
    99+
    2023-05-14
    Flutter学习 Flutter Row Flutter Colum Flutter布局
  • cisco学习笔记(3)
    1. 交换机支持的命令:交换机基本状态: switch: ;ROM状态, 路由器是rommon>hostname> ;用户模式hostname# ;特权模式...
    99+
    2023-01-31
    学习笔记 cisco
  • OSPF 学习笔记3
    ospf特殊区域 减少LSA洪泛,达到优化路由表的目的 sub区域特点 1、过滤了LSA4/5 2、通过ABR的LSA3学习到一条到达域外的缺省路由(O*IA) 3、区域内所有的路由器都得设置为stub路由器 ...
    99+
    2023-01-31
    学习笔记 OSPF
  • perl学习笔记(3)
    条件结构: if(...){       ...; }elsif(...){       ...; }else{       ...; } 数值关系运算符 ==,>...
    99+
    2023-01-31
    学习笔记 perl
  • shell 学习笔记3
    ####shell结构 #!指定执行脚本的shell #注释行 命令和控制结构  第一步:创建一个包含命令和控制结构的文件  第二步:修改这个文件的权限使它可以执行,chmod u+x...
    99+
    2023-01-31
    学习笔记 shell
  • GEF学习笔记3
    八、创建嵌套的视图 前面的步骤,创建了公司视图,下面再创建一个国家视图用来容纳公司视图。这就需要按前面的方法把MVC都重新创建一遍。 Model View(Figure) Control(EditPart) 注意重写红框中标...
    99+
    2023-01-31
    学习笔记 GEF
  • PowerShell 学习笔记(3)
    获取对象的过程中,最好先筛选出对象,再进行操作。(即筛选在排序左边)不区分大小写get-process | where {$_.handles –ge 1000}使用where获取所有对象,用对象执行大括号里的代码,如果...
    99+
    2023-01-31
    学习笔记 PowerShell
  • PHP 学习笔记 (3)
    昨天笔记2说道了PHP的标记以及短标记,今天记录下如何吧PHP从HTML分离手册参考:http://www.php.net/manual/zh/language.basic-syntax.phpmode.phpPHP手册告诉我们,PHP凡是...
    99+
    2023-01-31
    学习笔记 PHP
  • CCNP学习笔记(3)
    一、RIPv2:Routing Information Protocol 路由信息协议 1.特性: ①属于“距离矢量”路由协议 ②定期发送路由更新(30S一次,路由表中所有路由) ③依据“跳数”衡量路径好坏 ...
    99+
    2023-01-31
    学习笔记 CCNP
  • python学习笔记(3)
    在大概了解了程序之后,我也买了本python书学习一下,因为现在新版的python3.4.0已经不再兼容2.x.x的内容,书虽然很新,但是有些例子还是用的过去的。1.比如在3.0中print 42不能再产生输出了,要改成print(42)&...
    99+
    2023-01-31
    学习笔记 python
  • shell学习笔记(3)
    一、if基础 1、单分支 1.1 语法 if语句语法 单分支结构语法: if [条件]; then 指令 fi 或 if [条件] then ...
    99+
    2023-01-31
    学习笔记 shell
  • MySQL学习笔记(3):SQL
    本文章更新于2020-06-14,使用MySQL 5.7,操作系统为Deepin 15.9。 目录DDL语句创建数据库删除数据库修改数据库创建表删除表修改表创建索引删除索引创建视图修改视图删除视图存储过程和函数创建事件修改事件删除...
    99+
    2022-04-25
    MySQL学习笔记(3):SQL
  • solaris学习笔记3:mount
    mount学习   1.文件系统基本概念,UFS,ZFS,VxFS,WAFL   2./etc/vfstab 预定义挂载文件系统;    /etc/mnttab 已挂载文件系统   3.man mount    man mount_ufs ...
    99+
    2023-01-31
    学习笔记 solaris mount
  • Python 3 学习笔记:Excel
    安装模块 OpenPyXL 模块是一个第三方模块,所以需要使用 pip 工具安装, pip install openpyxl 文件结构 首先,我们需要了解一下 Excel 文件的基本结构,一个 Excel 文件被称为一个工作薄,工作薄中可以...
    99+
    2023-01-31
    学习笔记 Python Excel
  • Powershell学习笔记3——has
    Manning--Powershell In Action Page 66   Collections:dicitonaries and hashtables One of the most flexible datatypes suppo...
    99+
    2023-01-31
    学习笔记 Powershell
  • Python学习笔记(3)--- Fla
    在安装flask前,首先安装pip安装地址:https://pip.pypa.io/en/stable/installing.html#install-pip下载(保存):在dos命令下执行 python get-pip.py安装然后 执行...
    99+
    2023-01-31
    学习笔记 Python Fla
  • python 学习笔记 3 -- 数据
    当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 引用 那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。eg. # -*- coding: utf-8 -*-  shopli...
    99+
    2023-01-31
    学习笔记 数据 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作