上篇内容,我们详细介绍了使用PyCharm中Live Template功能快速输入一个GUI应用框架的办法。(参见学会这一招,图形界面编程不再复杂,Python工具PyCharm使用技巧)这样,我们通过在PyCharm中输入"qtmw"四个字符,就可以快速得到一个具有菜单栏、工具栏、状态栏、主工作区的一个GUI应用程序框架。
输入四个字符获得上图内容
这样,我们通过修改相应的内容即可构建自己的GUI应用程序了。但是,如果你不了解PyQt5中QWidget对象,在构建自己的应用程序时,还是有难度的。今天,跟大家一起来了解下QWidget对象的坐标系统及显示接口。
坐标系统及显示接口
PyQt窗体坐标系统
我们知道,QWidget是PyQt5中所有用户界面对象的基类,所有的控件都直接或者间接继承了该基类对象。另一方面,我们把没有嵌入到其它控件中的控件称为窗口对象,即窗口对象区别在于它没有嵌入到其它QWidget控件中。
对象相互嵌入关系来理解
如果要将一个控件嵌入到另一个QWidget控件中,PyQt是如何判断其嵌入位置的呢?PyQt5中有一套自己的坐标系统,如下图所示。
PyQt5坐标系统
以屏幕的左上角位置为原点(0,0),从左到右为x轴正向,从上到下为y轴正向。屏幕坐标系统是用来定位顶层窗口的。
理解坐标系统是第一步
然后是窗体内部坐标系统,分为两个:一个是frameGeometry()区域,它包含了客户区、标题栏、边框在内的整个窗体,坐标轴以客户区加上边框的起点为坐标原点(0,0),方向和屏幕坐标方向表示一致;另一个是geometry()区域,这一部分内容我们称之为客户区,以客户区起始位置为原点(0,0),方向同屏幕坐标系统方向一致。
内部两种坐标机制
通过窗体内部的坐标系统很容易获得窗体的边框大小及标题栏大小及位置。
具体的定位及计算方法参见图示:
坐标系统详解
通过上面两张图片,了解PyQt坐标系统就很容易了。下面我们来看下它提供了哪些计算接口
成员函数
QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标位置,width()、height()获得客户区的宽度和高度。
通过大小及位置描述一个矩形区域
QWidget的geometry()提供的成员函数:x()、y()获得客户区左上角坐标位置,width()、height()同样可以获得客户区的宽度和高度。
内部区域描述分两种情况
QWidget的frameGeometry()提供成员函数:x()、y()获得窗口左上角的坐标(此坐标包含窗口的边框),width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽度和高度。
位置相关接口
一般情况下,我们将客户端区域称之为QRect类,它是一个长方形区域,定义了自己的大小和位置,大小是指宽度和高度(width和height)。
哪些接口用于改变位置及大小
改变客户区的大小
QWidget.resize(width, height)
QWidget.resize(QSize)
改变大小
获得客户区大小
QWidget.size()
获得客户区宽度和高度
QWidget.width()
QWidget.height()
获取属性
设置客户区的宽度和高度
QWidget.setFixedWidth(int width)
QWidget.setFixedHeight(int height)
或者使用
QWidget.setFixedSize(QSize size)
QWidget.setFixedSize(int width, int height)
同时改变客户区的大小和位置
QWidget.setGeometry(int x, int y, int width, int height)
QWidget.setGeometry(QRect rect)
带边框的处理接口
上面都是不包含客户区的边框及窗口的标题栏等内容的。如果要计算frameGeometry()区域,提供的常用接口有:
获取窗口的大小和位置
QWidget.frameGeometry()
设置窗口的位置
QWidget.move(int x, int y)
QWidget.move(Point point)
获得窗体左上角的位置
QWidget.pos()
举个例子
我们创建一个QWidget对象,然后在其中放置一个QPushButton控件,再打印输出其位置信息。
举个栗子
不赘述,直接上代码
#! /usr/bin/env python
# coding:utf-8
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
import sys
app = QApplication(sys.argv)
widget = QWidget()
btn = QPushButton(widget)
btn.setText('PushButton')
# 以QWidget左上角为(0, 0)点
btn.move(20, 20)
# 不同操作系统可能对窗口的最小宽度有限定,若设置宽度小于规定值,则会以规定值进行显示
widget.resize(300, 200)
# 以屏幕左上角为(0, 0)点
widget.move(250, 200)
widget.setWindowTitle('PyQt坐标系统例子')
widget.show()
print('QWidget:')
print('w.x()={}'.format(widget.x()))
print('w.y()={}'.format(widget.y()))
print('w.width()={}'.format(widget.width()))
print('w.height()={}'.format(widget.height()))
print('QWidget frameGeometry:')
print('QWidget.frameGeometry().x()={}'.format(widget.frameGeometry().x()))
print('QWidget.frameGeometry().y()={}'.format(widget.frameGeometry().y()))
print('QWidget.frameGeometry().width()={}'.format(widget.frameGeometry().width()))
print('QWidget.frameGeometry().height()={}'.format(widget.frameGeometry().height()))
print('QWidget.geometry:')
print('widget.geometry().x()={}'.format(widget.geometry().x()))
print('widget.geometry().y()={}'.format(widget.geometry().y()))
print('widget.geometry().width()={}'.format(widget.geometry().width()))
print('widget.geometry().height()={}'.format(widget.geometry().height()))
print('PushButton:')
print('PushButton.x()={}'.format(btn.x()))
print('PushButton.y()={}'.format(btn.y()))
print('PushButton.width()={}'.format(btn.width()))
print('PushButton.height()={}'.format(btn.height()))
print('PushButton.geometry().x()={}'.format(btn.geometry().x()))
print('PushButton.geometry().y()={}'.format(btn.geometry().y()))
print('PushButton.geometry().width()={}'.format(btn.geometry().width()))
print('PushButton.geometry().height()={}'.format(btn.geometry().height()))
结果如下
程序输出结果如下:
>>>
QWidget:
w.x()=250
w.y()=200
w.width()=300
w.height()=200
QWidget frameGeometry:
QWidget.frameGeometry().x()=250
QWidget.frameGeometry().y()=200
QWidget.frameGeometry().width()=302
QWidget.frameGeometry().height()=232
QWidget.geometry:
widget.geometry().x()=251
widget.geometry().y()=231
widget.geometry().width()=300
widget.geometry().height()=200
PushButton:
PushButton.x()=20
PushButton.y()=20
PushButton.width()=75
PushButton.height()=23
PushButton.geometry().x()=20
PushButton.geometry().y()=20
PushButton.geometry().width()=75
PushButton.geometry().height()=23
>>>
打印输出了各个控件位置及大小信息,感兴趣的小伙伴在编译器中试试看,有助于我们更好地理解QWidget的坐标系统。
PyQt的坐标系统
好了,今天的内容就到这里了,喜欢Python编程的小伙伴们关注我,后续会推出有关Python方方面面的内容。
转载请注明出处,百家号:Python高手养成