Qt for Python布局管理(2)—绝对定位
off999 2024-10-18 08:10 78 浏览 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 布局管理中较为常用的盒式布局及其子类水平布局,敬请期待!
希望本文能对您有所帮助!若文中存在疏忽不足或错误,还请不吝赐教!
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
