Qt for Python布局管理(2)—绝对定位
off999 2024-10-18 08:10 51 浏览 0 评论
前言
本系列介绍如何在 Python 中使用 Qt for Python 进行 GUI 应用程序开发。
- 第一篇文章:Qt for Python学习笔记—简介
- 第二篇文章:Qt for Python学习笔记—搭建开发环境
- 第三篇文章:Qt for Python学习笔记—应用程序初探
- 第四篇文章:Qt for Python学习笔记—应用程序再探
- 第五篇文章:Qt for Python—Qt Designer 概览
- 第六篇文章:Qt for Python—可视化开发GUI应用程序
- 第七篇文章:Qt for Python布局管理(1)—概览
本文是《Qt for Python 学习笔记》系列第八篇,对 Qt for Python 的绝对定位(包括坐标系统、窗口几何形状相关函数、坐标访问函数、绝对定位常用设定函数、绝对布局示例和两个改进示例等)进行了较为详细的介绍,让读者对 Qt for Python 绝对定位有个较为全面的认识。
1. 简介
1.1 术语
下表列示了本文涉及到的一些术语:
1.2 绝对定位
绝对定位是一种原始的定位方式:首先要明确待放置部件的坐标值(x, y)和尺寸(宽、高),这样 Qt 就知道该把组件放在哪里以及如何设置组件的尺寸。
绝对定位非常简单、直观和易于理解掌握,但是存在一个问题:当用户改变了窗口大小(比如使用鼠标拖动窗口边缘进行拉伸操作)时,采用绝对定位的组件仍然保持原状(原位置、原尺寸),而不会有任何响应(如随着窗口同步改变尺寸等)。
存在这样的问题是正常的,因为如果程序代码中未做特殊处理,那么在窗口变化时,Qt 并不知道部件是否需要(对自己的位置和尺寸)进行更新以及如何更新。
解决这类问题通常有两种方法:
- 方法一:可以在程序中设置禁止改变窗口大小。这种方法比较简单,但通常并不可取。
- 方法二:可以在程序中专门对发生窗口大小改变时调用自定义的部件更新函数,让部件按照一定的规则完成随窗口大小变化而同步更新。
绝对定位机制通常适用于窗口和部件固定的应用情形。
2. 坐标系统
要进行绝对定位的前提是必要要有坐标系统。
每个 GUI 都有对应的坐标系统,坐标系统用于在图形界面程序中进行窗口和组件的定位以及尺寸设置。
一、物理坐标(或设备坐标)
Windows 系统上的物理坐标又称为设备坐标,是指输出设备的坐标。最常见的输出设备为显示器,它是一个以像素为基本单位进行描述的设备。
二、物理坐标系(或设备坐标系)特点
物理坐标(或设备坐标)对应的坐标系统为物理坐标系(或设备坐标系)。
物理坐标系(或设备坐标系)的特点是:
- 坐标原点(0, 0)在左上角,X轴向右为正,Y轴向下为正。
- X轴和Y轴的负半轴为虚设,超出设备的部分无法显示。
三、物理坐标系(或设备坐标系)分类
物理坐标系(或设备坐标系)可以分为屏幕坐标系、窗口坐标系和客户区域坐标系三种相互独立的坐标系:
- 屏幕坐标系:以屏幕左上角为坐标原点(0, 0)。用对象距离屏幕左上角的水平距离和垂直距离来标识对象的位置,以像素为单位来表示。
- 窗口坐标系:以窗口左上角为坐标原点(0, 0)。用对象距离窗口左上角的水平距离和垂直距离来标识对象的位置。
- 窗口客户区域坐标系:以窗口内客户区域左上角为坐标原点(0, 0)。用对象距离窗口客户区域左上角的水平距离和垂直距离来标识对象的位置。
Qt 中使用物理坐标系(或设备坐标系)来对窗口和部件进行定位以及尺寸设置。
3. 窗口几何形状相关函数
3.1 Qt 窗口几何形状相关函数
QWidget 类提供了一些处理窗口或部件几何形状的函数。这些函数适用于以下两类情形:
- 第一类情形:适用于窗口(包括窗口框架)的函数。
——(1) x() 函数
——(2) y() 函数
——(3) frameGeometry() 函数
——(4) pos() 函数
——(5) move(x, y) 函数
- 第二类情形:适用于窗口客户区域(不包括窗口框架)的函数。
——(1) geometry() 函数
——(2) width() 函数
——(3) height() 函数
——(4) rect() 函数
——(5) size() 函数
3.2 坐标访问函数
一、物理坐标函数示意图
Qt 的 QWidget 类提供了窗口部件所需的物理坐标系统函数,可用于在坐标系统中对窗口和部件进行定位以及尺寸设置。
下图显示了可使用的 QWidget 类的大多数坐标函数:
二、Qt 坐标访问函数分类及说明
Qt 提供了三组坐标访问函数:
(一)、frameGeometry() 提供的一组窗口(含窗口框架)相关的坐标访问函数
——frameGeometry() :返回窗口(含窗口框架)左上角在屏幕坐标上的坐标值和尺寸(宽度和高度),类型为 QRect;
——frameGeometry().x() :返回窗口(含窗口框架)左上角在屏幕坐标上的横坐标(x 值),等价于 x() 函数,等价于 pos().x() 函数;
——frameGeometry().y() :返回窗口(含窗口框架)左上角在屏幕坐标上的纵坐标(y 值),等价于 y() 函数,等价于 pos().y() 函数;
——frameGeometry().width() :返回窗口(含窗口框架)的宽度;
——frameGeometry().height() :返回窗口(含窗口框架)的高度。
(二)、geometry() 提供的一组窗口客户区域(不含窗口框架)相关的坐标访问函数
——geometry() :返回窗口客户区域左上角在屏幕坐标上的坐标值和尺寸(宽度和高度),类型为 QRect;
——geometry().x() :返回窗口客户区域左上角在屏幕坐标上的横坐标(x 值);
——geometry().y() :返回窗口客户区域左上角在屏幕坐标上的纵坐标(y 值);
——geometry().width() :返回窗口客户区域的宽度,等价于 width() 函数,等价于 rect().width() 函数,等价于 size().width() 函数;
——geometry().height() :返回窗口客户区域的高度,等价于 height() 函数,等价于 rect().height() 函数,等价于 size().height() 函数;
(三)、 QWidget 提供的一组相关坐标访问函数
——x() :返回窗口(含窗口框架)左上角在屏幕坐标上的横坐标(x 值),等价于 frameGeometry().x() 函数,等价于 pos().x() 函数;
——y() :返回窗口(含窗口框架)左上角在屏幕坐标上的纵坐标(y 值),等价于 frameGeometry().y() 函数,等价于 pos().y() 函数;
——width() :返回窗口客户区域的宽度,等价于 geometry().width() 函数;
——height() :返回窗口客户区域的高度,等价于 geometry().height() 函数。
注1:提供上述三组坐标函数是为了跨平台使用,由于不同平台的标题栏大小不同,以及注意每组坐标系统中的适用区域。
注2:在编码开发中,geometry() 和 frameGeometry() 中的几何数据必须在 show() 调用后才有效!!! 如果在 show() 调用之前调用的话数据是无效的,因为在不同的平台中如果窗口还未显示出来则无法知道边框大小,只有将窗口显示出来后才能获取有效的坐标系统数据。
3.3 绝对定位常用设定函数
我们在进行窗口或部件定位时,涉及位置和尺寸的常用的设定函数如下:
- 可以通过 setGeometry(x, y, w, h) 来设定/调整部件相对其父窗口的位置(左上角坐标)和尺寸(宽和高);
- 可以通过 move(x, y) 来设定/调整部件的位置(相对其父窗口的坐标);
- 可以通过 resize(w, h) 来设定/调整部件的尺寸(宽和高);
- 可以通过 setMinimumSize(w, h) 来设定/调整部件的最小尺寸(宽和高);
- 可以通过 setMaximumSize(w, h) 来设定/调整部件的最大尺寸(宽和高);
- 其他设定部件尺寸的函数
注:最常用的是前3个设定函数。
一、setGeometry() 函数
setGeometry(self, x:int, y:int, w:int, h:int) -> None
——功能:该函数用于设定/调整部件(或窗口)相对其父窗口的位置(左上角坐标)和尺寸(宽和高)。
——参数 x:表示部件左上角横坐标,int 类型;
——参数 y:表示部件左上角纵坐标,int 类型;
——参数 w:表示部件的宽度值(以像素为单位),int 类型;
——参数 h:表示部件的高度值(以像素为单位),int 类型。
注:窗口客户区域左上角为坐标原点(0, 0)。
二、move() 函数
move(self, x:int, y:int) -> None
——功能:该函数用于设定/调整部件(或窗口)(相对其父窗口的坐标)。
——参数 x:表示部件左上角横坐标,int 类型;
——参数 y:表示部件左上角纵坐标,int 类型。
注:屏幕左上角为坐标原点(0, 0)。
三、resize() 函数
resize(self, w:int, h:int) -> None
——功能:该函数用于设定/调整部件(或窗口)的尺寸(宽和高)。
——参数 w:表示部件的宽度值(以像素为单位),int 类型;
——参数 h:表示部件的高度值(以像素为单位),int 类型。
四、setMinimumSize() 函数
setMinimumSize(self, minw:int, minh:int) -> None
——功能:该函数用于设定/调整组件的最小尺寸(宽和高)。
——参数 minw:表示组件的最小宽度值(以像素为单位),int 类型;
——参数 minh:表示组件的最小高度值(以像素为单位),int 类型。
五、setMaximumSize() 函数
setMaximumSize(self, maxw:int, maxh:int) -> None
——功能:该函数用于设定/调整组件的最大尺寸(宽和高)。
——参数 maxw:表示组件的最大宽度值(以像素为单位),int 类型;
——参数 maxh:表示组件的最大高度值(以像素为单位),int 类型。
六、设定部件尺寸的其他函数
setMinimumWidth(self, minw:int) -> None
setMinimumHeight(self, minh:int) -> None
setMaximumWidth(self, maxw:int) -> None
setMaximumHeight(self, maxh:int) -> None
——功能:上述四个函数分别用于单独设定/调整组件的最小宽度、最小高度、最大宽度、最大高度。
——参数 minw:表示组件的最小宽度值(以像素为单位),int 类型;
——参数 minh:表示组件的最小高度值(以像素为单位),int 类型;
——参数 maxw:表示组件的最大宽度值(以像素为单位),int 类型;
——参数 maxh:表示组件的最大高度值(以像素为单位),int 类型。
4. 绝对定位示例原型
在进行 GUI 应用程序编码之前,一般建议先勾画出 GUI 框架(窗体及各部件的布局等)。
本绝对定位示例原型如下:
5. 初始示例
5.1 初始示例目标
我们首先确定初始示例程序所设想达到的目标。
一、示例目标
本示例目标是创建一个 Python GUI 应用程序,在主窗口中指定位置分别放置一个行编辑器(QLineEdit)部件。
注:为简化处理主窗口中只放置了一个部件。
主窗口及部件的位置、尺寸及其他属性如下:
- 主窗口
——(1) 窗口左上角在屏幕中的坐标为(300, 300)
——(2) 尺寸:宽420px,高50px
——(3) 标题:绝对布局示例程序
——(4) 具有窗口最小化、最大化、关闭快捷按钮
- 行编辑器部件(QLineEdit)
——(1) 左上角坐标为(10, 10)
——(2) 尺寸:宽400px,高30px
——(3) 文本内容:我是一个绝对定位的行编辑器:坐标(10, 10),尺寸(宽400px,高30px)
——(4) 文本对齐方式:居中对齐
——(5) 行编辑器颜色:文本颜色为蓝色;背景色为粉红色;
5.2 初始示例代码
利用 Visual Studio Code 编辑示例代码,并保存为文件(如:C:\MyPySide6\MyPySide6LayoutApp01.py)。
from PySide6.QtWidgets import (QWidget, QApplication, QLineEdit)
from PySide6.QtCore import Qt
class MyMainWindow(QWidget):
def __init__(self):
super(MyMainWindow, self).__init__()
self.initUi()
def initUi(self):
self.lineEdit = QLineEdit("我是一个绝对定位的行编辑器:坐标(10, 20),尺寸(宽400px,高30px)", self, alignment=Qt.AlignCenter)
self.lineEdit.setStyleSheet("color: blue; background-color: pink;")
self.lineEdit.move(10, 10)
self.lineEdit.resize(400, 30)
self.setWindowTitle("绝对定位示例程序")
self.setGeometry(300, 300, 420, 50)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
5.3 示例代码解析
本示例代码共分三部分:
一、导入模块(或类)部分
from PySide6.QtWidgets import (QWidget, QApplication, QLineEdit)
from PySide6.QtCore import Qt
——第1行代码:表示从 PySide6.QtWidgets 模块导入后续代码中会用到 QApplication 类、QWidget 类、QLineEdit 类。
——第2行代码:表示从 PySide6.QtCore 模块导入后续代码中会用到 Qt 类。
二、自定义 MyMainWindow 类部分
其次,自定义 MyMainWindow 类(即主窗口,继承自 QWidget 类):
(一)定义类的声明
class MyMainWindow(QWidget):
...
自定义 MyMainWindow 类的声明语句。类名为 MyMainWindow,该类继承自 QWidget 类。
(二)定义类的构造函数
def __init__(self):
super(MyMainWindow, self).__init__()
self.initUi()
上述代码定义了自定义 MyMainWindow 类的构造函数:
——第1行代码:声明一个类构造函数( __init__(self)),有一个传递参数(self)。
——第2行代码:通过 super() 方法继承了父类(QWidget)构造函数中的全部属性。
——第3行代码:调用 initUi() 方法,完成窗体的初始化。该方法会在类中加以定义。
(三)定义类方法 initUi(self)
def initUi(self):
self.lineEdit = QLineEdit("我是一个绝对定位的行编辑器:坐标(10, 20),尺寸(宽400px,高30px)", self, alignment=Qt.AlignCenter)
self.lineEdit.setStyleSheet("color: blue; background-color: pink;")
self.lineEdit.move(10, 10)
self.lineEdit.resize(400, 30)
self.setWindowTitle("绝对定位示例程序")
self.setGeometry(300, 300, 420, 50)
上述代码定义了一个类方法 initUi(self) ,用于窗体的初始化,创建了窗体上的所有部件并设置其属性。
——第1行代码:声明一个类方法(函数名 initUi),有一个传递参数(self)。
——第2行代码:创建1个行编辑器对象(对象名为 lineEdit),并设置其显示文本内容(居中对齐)。
——第3行代码:行编辑器对象调用其 setStyleSheet() 方法,设置其背景色为粉红色,文本颜色为蓝色。
——第4行代码:行编辑器对象调用其 move() 方法,设置行编辑器放置的左上角坐标为(10, 10)。
——第5行代码:行编辑器对象调用其 resize() 方法,设置行编辑器的尺寸(宽400px,高30px)。
——第7行代码:窗体调用其 setGeometry() 方法,设置窗体客户区域左上角屏幕坐标(300, 300)和尺寸(宽420px,高50px)。
——第8行代码:设置窗体的标题("绝对定位示例程序")。
三、设置文件运行入口部分
最后,在设置文件运行入口部分,完成创建应用程序、创建和显示自定义主窗口、运行应用程序直至退出。
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
——第1行代码:通过 if __name__ == "__main__": 语句来设置文件运行入口。
——第2行代码:导入 Python 内置的 sys 模块,接下的 sys.argv 和 sys.ext() 会用到该模块。
——第4行代码:使用 QApplication 类创建一个应用程序对象(app),括号内的 sys.argv 表示构造时含的传递参数。
——第5行代码:使用自定义的 MyMainWindow 类创建应用程序的主窗口对象(win)。
——第6行代码:调用主窗口对象(win)的 show() 方法来显示该主窗口。
——第7行代码:运行应用程序,直至退出。
5.4 示例程序运行
直接在 Visual Studio Code 上点击主窗体上运行图标按钮来运行该示例程序。
上图是程序运行后的三种窗口:
- 上面的是程序运行后缩小后的窗口:此时行编辑器并没有进行同步缩放,导致显示不完整;
- 中间的是程序运行后原始窗口:满足设计目标;
- 下面的是程序运行后拉伸后的窗口:此时行编辑器并没有进行同步缩放,导致出现大片空白区域(按窗口最大化快捷按钮后的效果也是类似)。
可以看出,本初始示例程序虽然初步实现了示例目标,还明显存在问题(行编辑器并不会随着窗口大小变化而同步缩放)。
6. 改进示例1
6.1 改进示例目标1
在初始示例目标基础上:应禁止窗口改变大小,同时主窗口右上角最大化图标按钮应处于禁用状态。
6.2 改进方法
我们先采取第一种方法来加以改进,该方法简单粗暴,只需在代码中调用窗口的 setFixedSize() 方法即可实现。
def setFixedSize(self, w:int, h:int) -> None
——该方法功能:为对象设置固定的宽度和高度。
——参数 w:整形变量,表示设置固定的宽度值。
——参数 h:整形变量,表示设置固定的高度值。
6.3 改进代码及解析
利用 Visual Studio Code 在原初始示例代码基础上进行编辑,并另存为文件(如:C:\MyPySide6\MyPySide6LayoutApp02.py)。
一、改进代码
在原始示例代码中定义的 initUi(self) 函数的最后添加如下代码语句:
self.setFixedSize(self.width(), self.height())
注:因仅增加一行代码,就不再单独展示改进示例程序的完整代码了。
二、代码解析
上述改进代码调用 setFixedSize() 方法,设置其宽度值为窗体当前的宽度,其高度值为窗体当前的高度。
6.4 改进示例程序运行
直接在 Visual Studio Code 上点击主窗体上运行图标按钮来运行该改进后的示例程序。
下图是程序运行后的窗口:
可以发现本次改进后的程序窗口实现了改进示例目标1:即在初始示例基础上,禁止窗口被改变大小。同时禁用窗口最大化快捷按钮。
7. 改进示例2
7.1 改进示例目标2
在初始示例目标基础上,程序窗口允许进行拉伸或缩小(窗口最小为原始尺寸,不能再小),窗口拉伸时行编辑器应随着着窗口同步拉伸或缩小,并且行编辑器文本中的宽度和高度值应实时刷新。同时要求窗口最小化、最大化、关闭快捷按钮也都正常有效。
为简化起见,变化规则设置如下:
——(1) 窗口、行编辑器设置有最小尺寸,即各自构造时的初始尺寸。
——(2) 行编辑器:位置(左上角坐标)保持不变,在保持离窗口客户区域上下左右各10px外,宽度和宽度会随着窗口同步缩放。
7.2 改进方法
我们再采取第二种方法来加以改进。
改进技术原理:在窗口构造完成之后,窗口和各部件的位置和尺寸就确定下来了。当窗口大小发生(如拉伸窗口)时,会自动触发 resizeEvent() 事件。可以在 resizeEvent() 事件处理函数中对窗口中各部件的位置和尺寸更新进行处理,进而实现当窗口大小发生时,窗口中各部件也能随着窗口按相应规则同步缩放。
改进思路:
(1) 在程序代码中重新实现 resizeEvent() 事件处理函数,这样当发生窗口大小改变时会调用重新实现的 resizeEvent() 事件处理函数,让窗口及部件按照相应的规则完成随窗口大小变化而同步更新。
(2) 另外,各部件通常会有显示的最小尺寸,如果不加控制会导致窗口界面显示不完整,所以需要对窗口以及各部件的最小尺寸进行设置。
这种改进方法从技术原理上来讲是可行的,但实践中很少真正应用。原因是:一方面是这种做法需要逐一对各部件的位置和尺寸进行计算,然后重新设置其位置和尺寸,会非常复杂,容易疏忽遗漏某些情况导致不能达到预期效果;另一方面可以借助布局定位机制就能便捷地实现同样的效果,没必要采用这种低效的实现方法。
本文介绍这种改进方法,只是从技术角度验证一下,帮助加深对绝对定位机制的理解。
7.3 改进示例代码
利用 Visual Studio Code 在原初始示例代码基础上进行编辑,并另存为文件(如:C:\MyPySide6\MyPySide6LayoutApp03.py)。
from PySide6.QtWidgets import (QWidget, QApplication, QLineEdit)
from PySide6.QtCore import Qt
from PySide6.QtGui import QResizeEvent
class MyMainWindow(QWidget):
def __init__(self):
super(MyMainWindow, self).__init__()
self.initUi()
def initUi(self):
self.lineEdit = QLineEdit("我是一个绝对定位的行编辑器:坐标(10, 20),尺寸(宽400px,高30px)", self, alignment=Qt.AlignCenter)
self.lineEdit.setStyleSheet("color: blue; background-color: pink;")
self.lineEdit.move(10, 10)
self.lineEdit.resize(400, 30)
self.setGeometry(300, 300, 420, 50)
self.setMinimumSize(420, 50)
self.lineEdit.setMinimumSize(400, 30)
self.setWindowTitle("绝对定位示例程序")
def updateText(self):
str_width = str(self.width()-10*2)
str_height = str(self.height()-10*2)
text_lineEdit = "我是一个绝对定位的行编辑器:坐标(10, 20),尺寸(宽" + str_width +"px,高" + str_height +"px)"
self.lineEdit.setText(text_lineEdit)
def resizeEvent(self, event:QResizeEvent):
self.lineEdit.setGeometry(10, 10, self.width()-10*2, self.height()-10*2)
self.updateText()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
7.4 改进代码解析
改进代码基于初始示例代码,在本节中对已经解析过的代码就不再解析,只是针对改进代码进行解析。
一、在定义类方法 initUi(self) 中增加设置窗口和行编辑器的最小尺寸
在原始示例代码中定义的 initUi(self) 函数的最后添加如下2行代码语句:
self.setMinimumSize(420, 50)
self.lineEdit.setMinimumSize(400, 30)
——第1行代码:通过 setMinimumSize() 方法设置窗口的最小尺寸为(宽420px, 高50px)
——第2行代码:通过 setMinimumSize() 方法设置行编辑器的最小尺寸为(宽400px, 高30px)
二、重新实现 resizeEvent() 事件处理函数
在自定义 MyMainWindow 类中重新实现 resizeEvent() 事件处理函数:
def resizeEvent(self, event:QResizeEvent):
self.lineEdit.setGeometry(10, 10, self.width()-10*2, self.height()-10*2)
self.updateText()
——第1行代码:声明一个事件处理函数(函数名 resizeEvent),有两个传递参数(self 和 event),其中 event 是 QResizeEvent 类型(需要在文件开头部分从 PySide6.QtGui 模块中导入 QResizeEvent 类)。
——第2行代码:调用行编辑器的 setGeometry() 方法,设定行编辑器左上角坐标保持不变,宽度和高度随着窗口同步缩放(保持距离窗口客户区域上下左右各10px)。
——第3行代码:调用自定义函数 updateText(),刷新行编辑器文本内容中的宽度和高度值
三、自定义函数 updateText()
在自定义 MyMainWindow 类中自定义函数 updateText() :
def updateText(self):
str_width = str(self.width()-10*2)
str_height = str(self.height()-10*2)
text_lineEdit = "我是一个绝对定位的行编辑器:坐标(10, 20),尺寸(宽" + str_width +"px,高" + str_height +"px)"
self.lineEdit.setText(text_lineEdit)
——第1行代码:声明一个自定义函数(函数名 updateText),有一个传递参数(self)。
——第2行代码:调用 str() 方法将窗口客户区域的宽度值减去左右留空10px后的数值转换为字符串;
——第3行代码:调用 str() 方法将窗口客户区域的高度值减去上下留空10px后的数值转换为字符串;
——第4行代码:拼接行编辑器文本内容到字符串变量(text_lineEdit)
——第5行代码:调用行编辑器的 setText() 方法刷新其文本内容(主要是刷新文本内容中的宽度和高度值)
7.5 改进示例程序运行
直接在 Visual Studio Code 上点击主窗体上运行图标按钮来运行该改进后的示例程序。
下图是程序运行后的两种窗口(上面的是程序运行后原始窗口,下面是程序运行后拉伸后的窗口):
可以发现第2次改进后的程序窗口实现了改进示例目标2:
- 能按要求在窗口中显示行编辑器文本信息(粉红色背景,蓝色字体,居中对齐方式);
- 程序窗口可以进行拉伸或缩小(窗口最小为原始尺寸,不能再小),窗口拉伸时行编辑器会随着着窗口同步拉伸或缩小,并且行编辑器文本中的宽度和高度值会实时刷新。
- 窗口最小化、最大化、关闭快捷按钮也都正常有效。
结束语
本文是《Qt for Python 学习笔记》系列第七篇,比较详细地介绍了 Qt for Python 的绝对定位(包括坐标系统、窗口几何形状相关函数、坐标访问函数、绝对定位常用设定函数、绝对布局示例和两个改进示例等),让读者对 Qt for Python 绝对定位有个较为全面的了解和掌握,不过原则上并不建议读者采用绝对定位的方式来进行开发。
接下来会介绍 Qt for Python 布局管理中较为常用的盒式布局及其子类水平布局,敬请期待!
希望本文能对您有所帮助!若文中存在疏忽不足或错误,还请不吝赐教!
相关推荐
- 推荐一款Python的GUI可视化工具(python 可视化工具)
-
在Python基础语法学习完成后,进一步开发应用界面时,就需要涉及到GUI了,GUI全称是图形用户界面(GraphicalUserInterface,又称图形用户接口),采用图形方式显示的计算机操...
- 教你用Python绘制谷歌浏览器的3种图标
-
前两天在浏览matplotlib官方网站时,笔者无意中看到一个挺有意思的图片,就是用matplotlib制作的火狐浏览器的logo,也就是下面这个东东(网页地址是https://matplotlib....
- 小白学Python笔记:第二章 Python安装
-
Windows操作系统的python安装:Python提供Windows、Linux/UNIX、macOS及其他操作系统的安装包版本,结合自己的使用情况,此处仅记录windows操作系统的python...
- Python程序开发之简单小程序实例(9)利用Canvas绘制图形和文字
-
Python程序开发之简单小程序实例(9)利用Canvas绘制图形和文字一、项目功能利用Tkinter组件中的Canvas绘制图形和文字。二、项目分析要在窗体中绘制图形和文字,需先导入Tkinter组...
- 一文吃透Python虚拟环境(python虚拟环境安装和配置)
-
摘要在Python开发中,虚拟环境是一种重要的工具,用于隔离不同项目的依赖关系和环境配置。本文将基于windows平台介绍四种常用的Python虚拟环境创建工具:venv、virtualenv、pip...
- 小白也可以玩的Python爬虫库,收藏一下
-
最近,微软开源了一个项目叫「playwright-python」,作为一个兴起项目,出现后受到了大家热烈的欢迎,那它到底是什么样的存在呢?今天为你介绍一下这个传说中的小白神器。Playwright是...
- python环境安装+配置教程(python安装后怎么配置环境变量)
-
安装python双击以下软件:弹出一下窗口需选择一些特定的选项默认选项不需要更改,点击next勾选以上选项,点击install进度条安装完毕即可。到以下界面,证明安装成功。接下来安装库文件返回电脑桌面...
- colorama,一个超好用的 Python 库!
-
大家好,今天为大家分享一个超好用的Python库-colorama。Github地址:https://github.com/tartley/coloramaPythoncolorama库是一...
- python制作仪表盘图(python绘制仪表盘)
-
今天教大家用pyecharts画仪表盘仪表盘(Gauge)是一种拟物化的图表,刻度表示度量,指针表示维度,指针角度表示数值。仪表盘图表就像汽车的速度表一样,有一个圆形的表盘及相应的刻度,有一个指针...
- 总结90条写Python程序的建议(python写作)
-
1.首先 建议1、理解Pythonic概念—-详见Python中的《Python之禅》 建议2、编写Pythonic代码 (1)避免不规范代码,比如只用大小写区分变量、使用容易...
- [oeasy]python0137_相加运算_python之禅_import_this_显式转化
-
变量类型相加运算回忆上次内容上次讲了是从键盘输入变量input函数可以有提示字符串需要有具体的变量接收输入的字符串输入单个变量没有问题但是输入两个变量之后一相加就非常离谱添加图片注释,不超过1...
- Python入门学习记录之一:变量(python中变量的规则)
-
写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...
- 掌握Python的"魔法":特殊方法与属性完全指南
-
在Python的世界里,以双下划线开头和结尾的"魔法成员"(如__init__、__str__)是面向对象编程的核心。它们赋予开发者定制类行为的超能力,让自定义对象像内置类型一样优雅工...
- 11个Python技巧 不Pythonic 实用大于纯粹
-
虽然Python有一套强大的设计哲学(体现在“Python之禅”中),但总有一些情况需要我们“打破规则”来解决特定问题。这触及了Python哲学中一个非常核心的理念:“实用主义胜于纯粹主义”...
- Python 从入门到精通 第三课 诗意的Python之禅
-
导言:Python之禅,英文名是TheZenOfPython。最早由TimPeters在Python邮件列表中发表,它包含了影响Python编程语言设计的20条软件编写原则。它作为复活节彩蛋...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)