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类的坐标体系 www.yidianzixun.com...相关推荐

  1. 百家号 python高手养成_百家媒体号,日撸700的核心!

    百家媒体号,日撸700的核心! 我今天稍微看了一下百家号的后台,昨天的成绩还行,有进步,具体是这样子. 接近700 ,这个是我意料之中的,不是很吃惊.我看中的是几个数据:阅读量.阅读深度.pv值,虽然 ...

  2. python高手养成_不要总抱怨它慢了 突破性能瓶颈 找到Python序列筛选数据的最优解...

    在使用Python的过程中,我们经常会碰到这样的需求:得到了大量的序列数据(如元组.列表.字典.集合).但是,我们需要的数据是在序列中符合某一条件的数据,比如:我们从一大堆字符串中找到固定字符数的元素 ...

  3. python反向缩进_在Pycharm中对代码进行注释和缩进的方法详解

    在Pycharm中对代码进行注释和缩进的方法详解 一.注释 1. #单行注释 2. """ 多行注释 """ 3. pycharm多行注释快 ...

  4. java swing 案例详解_《Java Swing图形界面开发与案例详解》PDF_IT教程网

    资源名称:<Java Swing图形界面开发与案例详解>PDF 内容简介: <Java Swing图形界面开发与案例详解>全书共20章,其中第1-2章主要介绍有关Swing的基 ...

  5. 内容平台争夺笔杆子,百家号还向技术大牛伸出了橄榄枝

    我在多篇文章中说过,"内容"是2015年以来移动互联网的重心,短视频.直播.大文娱产业.问答.个性化资讯平台,这些已被点燃的行业无一不是属于内容产业.这个产业诞生了一下科技.映客. ...

  6. 百家号室内设计行业粉丝数量统计(2019.12.24)

    百家号 粉丝 淄博设计师陈行知 18524 设计本室内设计 13008 室内设计姐 10248 室内设计全解 9303 叮当手绘 8395 家居室内设计 3903 室内设计案例赏析 3603 室内设计 ...

  7. python高手养成百家号_使用Python制作一个GUI界面,将随机生成的姓名存入到Excel文件中...

    前面内容,我们详细介绍了如何使用Python生成一定数量的随机姓名. 如何用Python生成若干个随机姓名?男女取名有方法,不能千篇一律 之前,也提到过,我们在一些项目中,需要若干个随机姓名,为了节省 ...

  8. python高手养成百家号_拥有这件神器,菜鸟也可以成为数据分析大师(连载二)...

    上一篇文章我们带大家对词云自动生成工具的GUI界面框架进行了介绍,并对GUI界面使用的类NoteBook.Group.EntryField的常见使用方法进行了梳理.今天,我们带大家制作第一个页面:获取 ...

  9. python高手 百家号_别犹豫,美剧想看就看,手把手教你用Python轻松获取经典美剧地址...

    最早一部<越狱>转变了我对美剧的看法.主人公scofield的聪明才智和坚强的毅力,<绝命毒师>里面主人公的中年逆袭,<纸牌屋>里面老谋深算的政客,等等,这些美剧和 ...

最新文章

  1. PTA数据结构与算法题目集(中文)7-45
  2. ThinkPHP关联模型详解
  3. 【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
  4. ideaIU-2018.1.5.win-scala 激活方式
  5. mysql全表重命名备份_Mysql数据库和表的常用操作以及数据备份恢复
  6. [css] 你有使用:valid和:invalid来校验表单吗?
  7. 4K修复版《海上钢琴师》登陆全国院线,一文读懂背后的黑科技!
  8. Thymeleaf Error resolving template [index],template might not exist or might not be accessible
  9. C++ 传递指针给函数
  10. Red5流媒体服务器的完整尝试
  11. HTML 的属性 lang=“en“ 语言设置为中文
  12. 千叶加密php,哪位大侠可以透漏一下千叶素是什么?
  13. Vue2:使用Vant UI实现网易云评论页上拉和下拉刷新
  14. 依据Right-BICEP要求的对四则运算2的测试
  15. java密码框转字符串_实现汉字的凯撒密码(内容包括:去掉字符串中的转义字符、汉字的unicode转换)...
  16. 海思HI3516A千兆网卡换百兆网卡配置方法
  17. 整理一些前端模版比较好的网站
  18. pda扫码相关的打印机,用蓝牙连接打印,斑马打印机,zsu
  19. 0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍
  20. 猫猫龙猫猫004:vim编辑器理解和命令

热门文章

  1. mx250可以机器学习吗_图灵未上,性能小增:今年轻薄本到底要不要上MX 250
  2. i can sayABC(2006-7-13)
  3. VBend、unload、exit sub、 end sub、close、hide的比较
  4. 读《韭菜的自我修养》,李笑来都讲了什么?
  5. 在半个中国象棋棋盘上,马在左下角(1,1)处,马走日字,求到指定位置有多少种走法
  6. libIconv库实现中文中字符串与GBK、Unicode、UTF-8三种编码互转
  7. VMware启动虚拟机时电脑蓝屏解决办法
  8. 12个校区?!盘点中国大学校区数量排行榜!
  9. Graphviz的使用指南
  10. #千锋逆战班,ssf# 在千锋“逆战”学习第 29天, 每个人生阶段都需要努力去扮好自己的角色,越努力越轻松,越坚强越幸运! 加油