Qt for Python布局管理(2)—绝对定位
off999 2024-10-18 08:10 28 浏览 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 gui开发)
-
Python的GUI编程框架有很多,这里为您推荐几个常用且功能强大的框架:Tkinter:Tkinter是Python的标准GUI库,它是Python内置的模块,无需额外安装。它使用简单,功能较为基础...
- python自动化框架学习-pyautogui(python接口自动化框架)
-
一、适用平台:PC(windows和mac均可用)二、下载安装:推荐使用命令行下载(因为会自动安装依赖库):pipinstallPyAutoGUI1该框架的依赖库还是蛮多的,第一次用的同学耐心等...
- Python 失宠!Hugging Face 用 Rust 新写了一个 ML框架,现已低调开源
-
大数据文摘受权转载自AI前线整理|褚杏娟近期,HuggingFace低调开源了一个重磅ML框架:Candle。Candle一改机器学习惯用Python的做法,而是Rust编写,重...
- Flask轻量级框架 web开发原来可以这么可爱呀~(建议收藏)
-
Flask轻量级框架web开发原来可以这么可爱呀大家好呀~今天让我们一起来学习一个超级可爱又实用的PythonWeb框架——Flask!作为一个轻量级的Web框架,Flask就像是一个小巧精致的工...
- Python3使用diagrams生成架构图(python架构设计)
-
目录技术背景diagrams的安装基础逻辑关系图组件簇的定义总结概要参考链接技术背景对于一个架构师或者任何一个软件工程师而言,绘制架构图都是一个比较值得学习的技能。这就像我们学习的时候整理的一些Xmi...
- 几个高性能Python网络框架,高效实现网络应用
-
Python作为一种广泛使用的编程语言,其简洁易读的语法和强大的生态系统,使得它在Web开发领域占据重要位置。高性能的网络框架是构建高效网络应用的关键因素之一。本文将介绍几个高性能的Python网络框...
- Web开发人员的十佳Python框架(python最好的web框架)
-
Python是一种面向对象、解释型计算机程序设计语言。除了语言本身的设计目的之外,Python的标准库也是值得大家称赞的,同时Python还自带服务器。其它方面,Python拥有足够多的免费数据函数库...
- Diagram as Code:用python代码生成架构图
-
工作中常需要画系统架构图,通常的方法是通过visio、processon、draw.io之类的软件,但是今天介绍的这个软件Diagrams,可以通过写Python代码完成架构图绘制,确实很co...
- 分享一个2022年火遍全网的Python框架
-
作者:俊欣来源:关于数据分析与可视化最近Python圈子当中出来一个非常火爆的框架PyScript,该框架可以在浏览器中运行Python程序,只需要在HTML程序中添加一些Python代码即可实现。该...
- 10个用于Web开发的最好 Python 框架
-
Python是一门动态、面向对象语言。其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性。除了语言本身的设计目的之外,Python标准库也是值得大家称赞的,Python甚至还...
- 使用 Python 将 Google 表格变成您自己的数据库
-
图片来自Shutterstock,获得FrankAndrade的许可您知道Google表格可以用作轻量级数据库吗?GoogleSheets是一个基于云的电子表格应用程序,可以像大多数数据库管...
- 牛掰!用Python处理Excel的14个常用操作总结!
-
自从学了Python后就逼迫用Python来处理Excel,所有操作用Python实现。目的是巩固Python,与增强数据处理能力。这也是我写这篇文章的初衷。废话不说了,直接进入正题。数据是网上找到的...
- 将python打包成exe的方式(将python文件打包成exe可运行文件)
-
客户端应用程序往往需要运行Python脚本,这对于那些不熟悉Python语言的用户来说可能会带来一定的困扰。幸运的是,Python拥有一些第三方模块,可以将这些脚本转换成可执行的.exe...
- 对比Excel学Python第1练:既有Excel,何用Python?
-
背景之前发的文章开头都是“Python数据分析……”,使得很多伙伴以为我是专门分享Python的,但我的本意并非如此,我的重点还是会放到“数据分析”上,毕竟,Python只是一种工具而已。现在网上可以...
- 高效办公:Python处理excel文件,摆脱无效办公
-
一、Python处理excel文件1.两个头文件importxlrdimportxlwt其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入。2.读取exce...
你 发表评论:
欢迎- 一周热门
-
-
python 3.8调用dll - Could not find module 错误的解决方法
-
加密Python源码方案 PyArmor(python项目源码加密)
-
Python3.8如何安装Numpy(python3.6安装numpy)
-
大学生机械制图搜题软件?7个受欢迎的搜题分享了
-
编写一个自动生成双色球号码的 Python 小脚本
-
免费男女身高在线计算器,身高计算公式
-
将python文件打包成exe程序,复制到每台电脑都可以运行
-
Python学习入门教程,字符串函数扩充详解
-
Python数据分析实战-使用replace方法模糊匹配替换某列的值
-
Python进度条显示方案(python2 进度条)
-
- 最近发表
-
- python gui编程框架推荐以及介绍(python gui开发)
- python自动化框架学习-pyautogui(python接口自动化框架)
- Python 失宠!Hugging Face 用 Rust 新写了一个 ML框架,现已低调开源
- Flask轻量级框架 web开发原来可以这么可爱呀~(建议收藏)
- Python3使用diagrams生成架构图(python架构设计)
- 几个高性能Python网络框架,高效实现网络应用
- Web开发人员的十佳Python框架(python最好的web框架)
- Diagram as Code:用python代码生成架构图
- 分享一个2022年火遍全网的Python框架
- 10个用于Web开发的最好 Python 框架
- 标签列表
-
- python计时 (54)
- python安装路径 (54)
- python类型转换 (75)
- python进度条 (54)
- python的for循环 (56)
- python串口编程 (60)
- python写入txt (51)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python qt (52)
- python人脸识别 (54)
- python斐波那契数列 (51)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- centos7安装python (53)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)