一、 引言

在Designer的部件栏中,有两种类型的Spacers部件,下图中上面布局中为一个水平间隔部件(按钮1和按钮2之间的部件),下面布局中为一个垂直间隔部件(按钮3和4之间),如图:



这两种部件用于在布局中不同部件间增加间隔,以辅助解决一些布局无法完美解决的部件布局排列美观问题。

二、 Spacers部件的相关属性

2.1、概述

Spacers部件非常简单,除了名字之外只有三个属性,分别是orientation、sizeType和sizeHint。Spacers部件对应的类实际上是QSpacerItem类,但从QSpacerItem类来看,除了sizeHint属性能与Designer中的部件属性相同之外,并没有orientation、sizeType这两个属性。这是由于Spacers部件本身的特殊性导致的。

2.2、orientation和sizeType属性

从引言中的图可以看出,两种Spacers部件在Designer中的部件图形表现为两种线型,水平间隔部件(Horizontal Spacer)体现为一根比较粗的横线,垂直间隔部件(Vertical Spacer)体现为一根比较粗的竖线。

对这两种部件来说,横线对应部件在拉伸时的高度大小策略没有意义,竖线对应部件在拉伸时的宽度大小策略没有意义,因此Spacer部件的sizeType实际上就是sizePolicy,对应取值及含义也与sizePolicy一样:



只是sizePolicy一般是两维的(横向和纵向),而这里只有一维,具体是哪一维需要根据是横线部件还是竖线部件来确认,而方向是来确认使用哪一维:如果是水平横向,则sizeType表示宽度的拉伸策略,如果是垂直纵向,则sizeType表示高度的拉伸策略,另一维的拉伸策略都固定为QSizePolicy.Minimum。因此方向是仅用于确认sizeType的值是对应宽度还是高度的大小策略,本身并没有对应的单独类属性。

2.3、sizeHint属性

sizeHint为Qt建议部件的大小,也称为首选大小。在《PyQt(Python+Qt)学习随笔:Qt Designer中部件的三个属性sizeHint缺省尺寸、minimumSizeHint建议最小尺寸和minimumSize最小尺寸》中我们说sizeHint为布局管理器中部件的缺省大小,该值是Qt中对每个部件大小的建议值,也是缺省值,不能修改,但在Spacer部件中是可以修改的,这是因为Spacer部件不是从QWidget类派生的部件,这里的sizeHint也并不简单是缺省大小。

Spacer部件的实际大小受部件的大小策略、sizeHint以及布局中其他部件的影响,具体参考上表sizePolicy的说明。

三、 Spacers部件的类型和方向的关系

上面已经介绍了Spacer部件的方向确认的是部件拉伸扩展策略作用的对象是垂直高度还是水平方向。而Spacers部件的两种类型其实就是缺省确认了两个不同的方向,水平间隔部件(Horizontal Spacer)的方向缺省就是水平方向,垂直间隔部件(Vertical Spacer)部件的方向缺省就是垂直方向。

可以通过属性编辑界面的orientation来改变缺省方向,即将水平间隔部件方向改为垂直方向,垂直间隔部件部件的方向改为水平方向。方向改变后的水平间隔部件实际上就变成了垂直间隔部件,反之亦然,因此这两个部件本质上就是一种。

我们通过生成的代码来对照看一下。

引言中的截图使用的间隔部件上面布局的是水平间隔部件,sizeHint被设置为(40,20),方向为水平方向,下面布局的是垂直间隔部件,sizeHint被设置为(20,40),方向为垂直方向,二者的sizeType被设置为Expanding。生成的创建Spacer部件的对应代码分别如下:

spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)

当两个间隔部件的方向改变之后,窗口布局变成如下:



生成的代码如下:

spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)

对比看一下代码,方向改变之后,就是部件创建时候的代码发生了两处变化:

1、 sizeHint的值的宽度和高度交换了一下值;

2、 sizePolicy的取值也发生了交换。

变换后, sizeHint的宽度变高度、高度变宽度,按默认值应该是方向指定维度变大、非指定维度变小,方向所指定的维度(即高度或宽度)的sizePolicy变更为sizeType指定值,另一个维度固定为Minimum策略。

四、 Spacers部件的使用

Spacers部件是在布局中的子部件周边或部件间增加间隔的空间,使得界面布局更合理。

1、 水平方向间隔部件一般是当布局内某个可以水平拉伸的部件希望不被拉伸时使用。

两个按钮在水平布局内水平排列,如图:



如果不设置间隔部件拉伸该窗口:



这个效果比较难看。如果在两个按钮前后都放置一个水平间隔部件,则拉伸后的效果如图:



此时再缩小如图:



可以明显看到加了间隔部件的效果要好看多了。

2、 垂直方向间隔部件一般是当布局内某个可以垂直拉伸的部件希望不被拉伸时使用。

两个按钮垂直布局内排列如图:



拉伸后效果如图:



在垂直方向加2个垂直间隔部件后拉伸效果如图:



如果在窗体布局(水平布局)上再增加水平间隔部件可以得到如下效果:



如果再调整右下角的垂直间隔部件的sizeType为Maximum,则可以得到如下效果:

五、 代码实现Spacers部件的增加

如果要在一个布局内增加间隔部件,只要在生成部件的代码中适当位置增加部件生成的代码就可以,有2种方法实现。

5.1、使用spacerItem方法

spaceItem = QtWidgets.QSpacerItem(int sizeHint.width, int sizeHint.height,
QSizePolicy.Policy widthPolicy, QSizePolicy.Policy heightPolicy)
布局.addItem(spaceItem)

5.2、使用addStretch方法

QBoxLayout.addStretch(int stretch = 0)

直接在要插入间隔部件的代码位置使用缺省值调用该方法就可以。

本节详细介绍了Qt Designer的间隔部件的属性和使用方法,并将可视部件与类QSpacerItem的对应关系进行了分析,最后给出了通过代码实现的两种方案,并给出了使用的案例。从给出的案例可以看出,间隔部件可以很好地提升布局的美观。

老猿Python,跟老猿学Python!

博文目录

博客地址

第15.13节 PyQt(Python+Qt)入门学习:Qt Designer的Spacers部件详解的更多相关文章

  1. 第15.14节 PyQt(Python+Qt)入门学习:Designer的Buttons按钮详解

    一.引言 Qt Designer中的Buttons部件包括Push Button(常规按钮.一般称按钮).Tool Button(工具按钮).Radio Button(单选按钮).Check Box( ...

  2. 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...

  3. Qt入门学习——Qt 5 帮助文档的使用

    Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...

  4. 第15.38节 PyQt(Python+Qt)入门学习:containers容器类部件QDockWidget停靠窗功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...

  5. 第15.18节 PyQt(Python+Qt)入门学习:Model/View架构中视图Item Views父类详解

    老猿Python博文目录 老猿Python博客地址 一.概述 在PyQt图形界面中,支持采用Model/View架构实现数据和界面逻辑分离,其中Model用于处理数据存储,View用于界面数据展现,当 ...

  6. 第15.37节 PyQt(Python+Qt)入门学习:containers容器类部件QMdiArea多文档界面部件详解及编程开发案例

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 老猿在前期学习PyQt相关知识时,对每个组件的属性及方法都研 ...

  7. 第15.36节 PyQt(Python+Qt)入门学习:containers容器类部件QFrame框架部件介绍

    一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有如下: 容器中的Frame为一个矩形的框架对象,对应类QFrame,QFrame类是PyQt中带框架 ...

  8. 第15.33节 PyQt(Python+Qt)入门学习:containers容器类部件QTabWidget选项窗部件简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  9. 第15.28节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTableWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 表格部件为应用程序提供标准的表格显示工具,在表格内可以管理基于行和列的数据项,表格中的最大 ...

随机推荐

  1. 01 . Vue简介,原理,环境安装

    简介 vue是一个JavaMVVM库,是一套用于构建用户界面的渐进式框架,是初创项目的首选前端框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计.它是轻量级的,它有很多独立的功能或库 ...

  2. Find Any File for Mac(文件搜索软件)v2.1.2b6

    Find Any File for Mac是应用在Mac上的一款文件搜索工具,Find Any File Mac可以通过名称.创建或修改日期,大小或类型和创建者代码(而不是内容)在本地磁盘上搜索文件. ...

  3. ubuntu mplayer "无法打开 VDPAU backend libvdpau ..."

    gnome mplayer 报错"无法打开 VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such ...

  4. [读书笔记] Python语言及其应用

    记录下秋招期间看的一本Python工具书<Python语言与其应用>,查漏补缺,部分内容整理如下: 易混淆概念 1.1 删除 - del,remove()和pop() 1.2 复制 - 浅 ...

  5. close与shutdown

    首先看一个例子,如下图所示: 当我们客户端发送ABCD再close套接字的时候,服务器端的接收通道也被关闭了,将无法接收ABCD的数据.如果想要仅仅关闭发送通道,保留接收通道,可以使用shutdown ...

  6. 你只会用 StringBuilder?试试 StringJoiner,真香!

    你只会用 StringBuilder/ StringBuffer 拼接字符串? 那你就 OUT 了!! 如果需要拼接分隔符的字符串,建议使用 Java 8 中的这款拼接神器:StringJoiner, ...

  7. linux组管理(groupadd/groupmod/gpasswd/groupdel)

    配置文件:  /etc/group 注:用户组(group)配置文件: /etc/gshadow 注:用户组(group)的影子文件: 查看组: cat /etc/group  或者  id -g t ...

  8. 01 Servlet技术

    Servlet 1.Servlet技术 1.1.什么是Servlet Servlet是JavaEE规范之一.规范就是接口 Servlet就JavaWeb三大组件之一.三大组件分别是:Servlet程序 ...

  9. Java编译程序和运行过程详解

    java整个编译以及运行的过程相当繁琐,我就举一个简单的例子说明: 编译原理简单过程:词法分析 --> 语法分析 --> 语义分析和中间代码生成 --> 优化 --> 目标代码 ...

  10. sqlilab less11-less18

    less-11 uname和passwd直接带入查询,万能密码 sqlmap自动搜索表单,或者抓包后用-r参数 less-12 post数据用小括号进行包裹,构造万能密码") or 1=1 ...