Qt for Python布局管理(2)—绝对定位
off999 2024-10-18 08:10 27 浏览 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 数据分析——利用Pandas进行分组统计
-
话说天下大势,分久必合,合久必分。数据分析也是如此,我们经常要对数据进行分组与聚合,以对不同组的数据进行深入解读。本章将介绍如何利用Pandas中的GroupBy操作函数来完成数据的分组、聚合以及统计...
- python数据分析:介绍pandas库的数据类型Series和DataFrame
-
安装pandaspipinstallpandas-ihttps://mirrors.aliyun.com/pypi/simple/使用pandas直接导入即可importpandasas...
- 使用DataFrame计算两列的总和和最大值_[python]
-
【如果对您有用,请关注并转发,谢谢~~】最近在处理气象类相关数据的空间计算,在做综合性计算的时候,DataFrame针对每列的统计求和、最大值等较为方便,对某行的两列或多列数据进行求和与最大值等的简便...
- 8-Python内置函数
-
Python提供了丰富的内置函数,这些函数可以直接使用而无需导入任何模块。以下是一些常用的内置函数及其示例:1-print()1-1-说明输出指定的信息到控制台。1-2-例子2-len()2-1-说...
- Python中函数式编程函数: reduce()函数
-
Python中的reduce()函数是一个强大的工具,它通过连续地将指定的函数应用于序列(如列表)来对序列(如列表)执行累积操作。它是functools模块的一部分,这意味着您需要在使用它之...
- 万万没想到,除了香农计划,Python3.11竟还有这么多性能提升
-
众所周知,Python3.11版本带来了较大的性能提升,但是,它具体在哪些方面上得到了优化呢?除了著名的“香农计划”外,它还包含哪些与性能相关的优化呢?本文将带你一探究竟!作者:BeshrKay...
- 最全python3.11版12类75个内置函数大全
-
获取全部内置函数:importbuiltins#导入模块yc=[]#异常属性nc=[]#不可调用fn=[]#内置函数defll(ty=builtins):...
- 软件测试笔试题
-
测试工程师岗位,3-5年,10-14k1.我司有一款产品,类似TeamViewer,向日葵,mstsc,QQ远程控制产品,一个PC客户端产品,请设想一下测试要点。并写出2.写出常用的SQL语句8条,l...
- 备战各大互联网巨头公司招聘会,最全Python面试大全,共300题
-
前言众所周知,越是顶尖的互联网公司在面试这一part的要求就越高,需要你有很好的技术功底、项目经验、一份漂亮的简历,当然还有避免不了的笔试过关。对于Python的工程师来说,全面掌握好有关Python...
- 经典 SQL 数据库笔试题及答案整理
-
马上又是金三银四啦,有蛮多小伙伴在跳槽找工作,但对于年限稍短的软件测试工程师,难免会需要进行笔试,而在笔试中,基本都会碰到一道关于数据库的大题,今天这篇文章呢,就收录了下最近学员反馈上来的一些数据库笔...
- 用Python开发日常小软件,让生活与工作更高效!附实例代码
-
引言:Python如何让生活更轻松?在数字化时代,编程早已不是程序员的专属技能。Python凭借其简洁易学的特点,成为普通人提升效率、解决日常问题的得力工具。无论是自动化重复任务、处理数据,还是开发个...
- 太牛了!102个Python实战项目被我扒到了!建议收藏!
-
挖到宝了!整整102个Python实战项目合集,从基础语法到高阶应用全覆盖,附完整源码+数据集,手把手带你从代码小白变身实战大神!这波羊毛不薅真的亏到哭!超全项目库,学练一站式搞定这份资...
- Python中的并发编程
-
1.Python对并发编程的支持多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成。多进程:multiprocessing,利用多核CPU...
- Python 也有内存泄漏?
-
1.背景前段时间接手了一个边缘视觉识别的项目,大功能已经开发的差不多了,主要是需要是优化一些性能问题。其中比较突出的内存泄漏的问题,而且不止一处,有些比较有代表性,可以总结一下。为了更好地可视化内存...
- python爬虫之多线程threading、多进程、协程aiohttp批量下载图片
-
一、单线程常规下载常规单线程执行脚本爬取壁纸图片,只爬取一页的图片。importdatetimeimportreimportrequestsfrombs4importBeautifu...
你 发表评论:
欢迎- 一周热门
-
-
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计时 (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)