python图形界面编程的理解_Python使用PyQt5进行图形界面GUI编程之详解QWidget类的坐标体系...

上篇内容,我们详细介绍了使用PyCharm中Live Template功能快速输入一个GUI应用框架的办法。(参见学会这一招,图形界面编程不再复杂,Python工具PyCharm使用技巧)这样,我们通过在PyCharm中输入"qtmw"四个字符,就可以快速得到一个具有菜单栏、工具栏、状态栏、主工作区的一个GUI应用程序框架。

d1160924ab18972b2df982f0e9c55a8f9f510ad3.jpeg?token=c2b9e1d46ee0a68c738086728d471f3f&s=003055324B63452442F504DA0000D0B2输入四个字符获得上图内容

这样,我们通过修改相应的内容即可构建自己的GUI应用程序了。但是,如果你不了解PyQt5中QWidget对象,在构建自己的应用程序时,还是有难度的。今天,跟大家一起来了解下QWidget对象的坐标系统及显示接口。

574e9258d109b3de6da153cedeb74d87800a4c0c.jpeg?token=7b0bde55f01b766007ce4238bb4557c7&s=9D08BC574E9B0DC068A7746B0300C07B坐标系统及显示接口

PyQt窗体坐标系统

我们知道,QWidget是PyQt5中所有用户界面对象的基类,所有的控件都直接或者间接继承了该基类对象。另一方面,我们把没有嵌入到其它控件中的控件称为窗口对象,即窗口对象区别在于它没有嵌入到其它QWidget控件中。

902397dda144ad347795bbf1c5aa2df231ad85af.jpeg?token=2ae746cdbb7de44636e31a4572f19f30&s=FB89CC095C53DADC062519AE0300A000对象相互嵌入关系来理解

如果要将一个控件嵌入到另一个QWidget控件中,PyQt是如何判断其嵌入位置的呢?PyQt5中有一套自己的坐标系统,如下图所示。

d31b0ef41bd5ad6e96270c688cc318ddb7fd3c67.jpeg?token=8262fd15128b6d5fff2396d0d244152d&s=A5B3CF321714FC2FEB7351EA0200703APyQt5坐标系统

以屏幕的左上角位置为原点(0,0),从左到右为x轴正向,从上到下为y轴正向。屏幕坐标系统是用来定位顶层窗口的。

0b7b02087bf40ad1938df63d592430d9a8ecce95.jpeg?token=81512981f088b0619bd12205e2d0c788&s=139473230F384D8852D5A8710100D073理解坐标系统是第一步

然后是窗体内部坐标系统,分为两个:一个是frameGeometry()区域,它包含了客户区、标题栏、边框在内的整个窗体,坐标轴以客户区加上边框的起点为坐标原点(0,0),方向和屏幕坐标方向表示一致;另一个是geometry()区域,这一部分内容我们称之为客户区,以客户区起始位置为原点(0,0),方向同屏幕坐标系统方向一致。

cefc1e178a82b9018077fcf87d8588713812ef35.jpeg?token=cab281ce28ca674a87ee186f41e07741&s=1AA07923603867885CE81D650100B062内部两种坐标机制

通过窗体内部的坐标系统很容易获得窗体的边框大小及标题栏大小及位置。

具体的定位及计算方法参见图示:

4a36acaf2edda3cc14756d270ee11807213f9236.jpeg?token=1be24478158853a3fc6e945493a898a8&s=FDA38A5610D8C4691E2BDDEE02005028坐标系统详解

通过上面两张图片,了解PyQt坐标系统就很容易了。下面我们来看下它提供了哪些计算接口

成员函数

QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标位置,width()、height()获得客户区的宽度和高度。

574e9258d109b3de61dfa39ddab74d87810a4cf5.jpeg?token=f4ff172e47d241f5f53ae117960c54fb&s=F51E3776071E64690E455C6E0300E070通过大小及位置描述一个矩形区域

QWidget的geometry()提供的成员函数:x()、y()获得客户区左上角坐标位置,width()、height()同样可以获得客户区的宽度和高度。

faedab64034f78f011d074726d392b53b2191c62.jpeg?token=cbd5d0c58a2837e58ac70b4a303d12d7&s=BC21C01366CAC311DD99C0D40100C0A1内部区域描述分两种情况

QWidget的frameGeometry()提供成员函数:x()、y()获得窗口左上角的坐标(此坐标包含窗口的边框),width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽度和高度。

位置相关接口

一般情况下,我们将客户端区域称之为QRect类,它是一个长方形区域,定义了自己的大小和位置,大小是指宽度和高度(width和height)。

78310a55b319ebc443d491c1972eeefa1f1716cc.jpeg?token=7bd48fc1c88bb260f6e395e1d8506166&s=A2B25184AE170FD64238B1050100E081哪些接口用于改变位置及大小

改变客户区的大小

QWidget.resize(width, height)

QWidget.resize(QSize)

71cf3bc79f3df8dc4054bbc8c219538d4710280f.jpeg?token=335dd5fe456dc858478ac62a202d582b&s=F22AB7450432262CC7A3A0A50300E04B改变大小

获得客户区大小

QWidget.size()

获得客户区宽度和高度

QWidget.width()

QWidget.height()

b219ebc4b74543a9f75e9fcb061fab84b9011479.jpeg?token=7a6f1501fa9ed1f1ef70ca6507a95ea5&s=A003DD1404A466B2CEACD8C40100A0E1获取属性

设置客户区的宽度和高度

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)

b7003af33a87e950de1885291f307245fbf2b472.jpeg?token=754c982ec80f878785c8c19d234e86bb&s=5C98A755C6795F867287C9D1030060B3带边框的处理接口

上面都是不包含客户区的边框及窗口的标题栏等内容的。如果要计算frameGeometry()区域,提供的常用接口有:

获取窗口的大小和位置

QWidget.frameGeometry()

设置窗口的位置

QWidget.move(int x, int y)

QWidget.move(Point point)

获得窗体左上角的位置

QWidget.pos()

举个例子

我们创建一个QWidget对象,然后在其中放置一个QPushButton控件,再打印输出其位置信息。

8d5494eef01f3a29ce0163b6962d9d375d607c8f.jpeg?token=be65ec81c8c305120e92d218b81791f3&s=4D863D72D9C176CC39EC14E502003023举个栗子

不赘述,直接上代码

#! /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()))

3c6d55fbb2fb4316e7e230e02dac672508f7d3bd.jpeg?token=399cb11fc63f5d0e46939b223fa5f7ea&s=7883E41ADF937CC81E78807403001032结果如下

程序输出结果如下:

>>>

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的坐标系统。

96dda144ad345982539e8d9803fc10abcbef84b6.jpeg?token=fd0dfacd481e29f72fa1837d46c0cde2&s=1AA87823273B6B8A1CE81C610100F062PyQt的坐标系统

好了,今天的内容就到这里了,喜欢Python编程的小伙伴们关注我,后续会推出有关Python方方面面的内容。

转载请注明出处,百家号:Python高手养成

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值