Python使用PyQt5进行图形界面GUI编程之详解QWidget类的坐标体系
上篇内容,我们详细介绍了使用PyCharm中LiveTemplate功能快速输入一个GUI应用框架的办法。(参见学会这一招,图形界面编程不再复杂,Python工具PyCharm使用技巧)这样,我们通过在PyCharm中输入"qtmw"四个字符,就可以快速得到一个具有菜单栏、工具栏、状态栏、主工作区的一个GUI应用程序框架。
这样,我们通过修改相应的内容即可构建自己的GUI应用程序了。但是,如果你不了解PyQt5中QWidget对象,在构建自己的应用程序时,还是有难度的。今天,跟大家一起来了解下QWidget对象的坐标系统及显示接口。
PyQt窗体坐标系统
我们知道,QWidget是PyQt5中所有用户界面对象的基类,所有的控件都直接或者间接继承了该基类对象。另一方面,我们把没有嵌入到其它控件中的控件称为窗口对象,即窗口对象区别在于它没有嵌入到其它QWidget控件中。
如果要将一个控件嵌入到另一个QWidget控件中,PyQt是如何判断其嵌入位置的呢?
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(intwidth)
QWidget.setFixedHeight(intheight)
或者使用
QWidget.setFixedSize(QSizesize)
QWidget.setFixedSize(intwidth,intheight)
同时改变客户区的大小和位置
QWidget.setGeometry(intx,inty,intwidth,intheight)
QWidget.setGeometry(QRectrect)
上面都是不包含客户区的边框及窗口的标题栏等内容的。
如果要计算frameGeometry区域,提供的常用接口有:
获取窗口的大小和位置
QWidget.frameGeometry
设置窗口的位置
QWidget.move(intx,inty)
QWidget.move(Pointpoint)
获得窗体左上角的位置
QWidget.pos
举个例子
我们创建一个QWidget对象,然后在其中放置一个QPushButton控件,再打印输出其位置信息。
不赘述,直接上代码
#!/usr/bin/envpython
#coding:utf-8
fromPyQt5.QtWidgetsimportQApplication,QWidget,QPushButton
importsys
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('QWidgetframeGeometry:')
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
QWidgetframeGeometry:
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的坐标系统。
好了,今天的内容就到这里了,喜欢Python编程的小伙伴们关注我,后续会推出有关Python方方面面的内容。
转载请注明出处,百家号:Python高手养成
百家号 python高手养成_【一点资讯】Python使用PyQt5进行图形界面GUI编程之详解QWidget类的坐标体系 ...