当前位置: 首页 > news >正文

PyQt5基本窗口控件(QWidget)

QWidget

基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口和控件都直
接或间接继承自QWidget类。

窗口控件(Widget,简称“控件”)是在PyQt中建立界面的主要元素。在PyQt
中把没有嵌入到其他控件中的控件称为窗口,一般窗口都有边框、标题栏:窗口是
指程序的整体界面,可以包含标题栏、菜单栏、工具栏、关闭按钮、最小化按钮、

最大化按钮等;控件是指按钮、复选框、文本框、表格、进度条等这些组成程序的
基本元素。一个程序可以有多个窗口,一个窗凵也可以有多个控件。

窗口坐标系统

PyQt使用统一的坐标系统来定位窗口控件的位置和大小。具体的坐标系统如
图4-7所示。

image

以屏幕的左上角为原点,即(0,0)点,从左向右为轴正向,从上向下为,轴正
向,整个屏幕的坐标系统就用来定位顶层窗囗的。

此外,在窗口内部也有自己的坐标系统,该坐标系统仍然以左上角作为原点,
从左向右为x轴正向,从上向下为轴正向,原点、轴、轴围成的区域叫作CIient
Area(客户区),在客户区的周围则是标题栏(WindowTitIe)和边框(Frame)。

如图4-8所示是Qt提供的分析QWidget几何结构的一张图,在帮助文档的
"Window and Dialog Widgets”中可以找到相关的内容介绍。

image
从图4-8可以看出,这些成员函数分为三类 。
QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()
获得客户区的宽度和高度。
QWidget的geomtry()提供的成员函数:x()、y()获得客户区左上角的坐标,
width()、height()获得客户区的宽度和高度。
QWidget的frameGeometry()提供的成员函数:x()、y()获得窗囗左上角的坐标,
width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽度和高度。

常用的几何机构

从图4-8可以看出,QWidget有两种常用的几何结构。
不包含外边各种边框的几何结构。
包含外边各种边框的几何结构。

QWidget不包含边框的常用函数

一般情况下,不包含边框的部分是客户区,这里面就是我们正常操作的地方,
可以添加子控件这部分是一个长方形,会有大小和位置.大小就是指宽度(width)
和高度(height);位置就是指这个长方形在屏幕上的位置。在Qt中保存这个长方形
使用的是QRect类,这个类也有自己的大小和位置。要改变其大小和位置,可以使
用如下几个函数。

改变客户区的面积
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)

x和y对应的就是x和y坐标。可以不单独设置攴和y坐标。

QWidget包含边框的常用函数

QWidget包含边框,这个边框有大小和位置,是窗口在屏幕上显示的整个区域。
这里没有设置这个边框大小的函数,因为通过上面不包含边框函数的设置,就
可以设置包含边框的大小了。通过下面的函数,可以获得整个窗口的位置和大小。

获得窗口的大小和位置
QWidget.frameGeometry()
设置窗口的位置
QWidget.move(int x,int y)
QWidget.move(QPoint point)
获得窗口左上角的坐标
QWidget.pos()

屏幕坐标系统显示

from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
import sysapp=QApplication(sys.argv)
widget=QWidget()
btn=QPushButton(widget)
btn.setText("Button")
# 以QWidget左上角为(0,0)点
btn.move(20,20)
# 不同操作系统可能对窗口最小宽度有规定,若设置宽度小于规定值,则会以规定值进行显示
widget.resize(300,200)
# 以屏幕左上角(0,0)点
widget.move(250,200)widget.setWindowTitle('PyQt坐标系统例子')
widget.show()
print("#1 QWidget")
print("widget.x()=%d"%widget.x())
print("widgt.y()=%d"%widget.y())
print("widget.width()%d"%widget.width())
print("widget.height()%d"%widget.height())print("#2 QWidget.geometry")
print("widget.geometry().x()=%d" %  widget.geometry().x() )
print("widget.geometry().y()=%d" %  widget.geometry().y() )
print("widget.geometry().width()=%d" %  widget.geometry().width() )
print("widget.geometry().height()=%d" %  widget.geometry().height() )
print("widget.size().width() =%d" %  widget.size().width() )
print("widget.size().height() =%d" %  widget.size().height() )print("#3 QWidget.frameGeometry")
print("widget.frameGeometry().width()=%d" %  widget.frameGeometry().width() )
print("widget.frameGeometry().height()=%d" %  widget.frameGeometry().height() )
print("widget.pos().x()=%d" %  widget.pos().x() )
print("widget.pos().y()=%d" %  widget.pos().y() )sys.exit(app.exec_())  

输出结果及截图

#1 QWidget
widget.x()=250
widgt.y()=200
widget.width()300
widget.height()200
#2 QWidget.geometry
widget.geometry().x()=251
widget.geometry().y()=238
widget.geometry().width()=300
widget.geometry().height()=200
widget.size().width() =300
widget.size().height() =200
#3 QWidget.frameGeometry
widget.frameGeometry().width()=302
widget.frameGeometry().height()=239
widget.pos().x()=250
widget.pos().y()=200

image

创建第一个PyQt5应用

下面的示例代码非常简单,只是显示一个小窗口。可以对窗口进行操作,比如
修改它的大小、最大化、最小化等。在很多程序中都需要进行这些操作,PyQt己经
写好了这些操作的代码,我们只需要引入封装好的代码就可以了。这些代码对程序
员来说是隐藏的。PyQt就是一个抽象的工具包,如果使用底层的工具包(Win32
MFC)来实现相同的功能,这个示例代码就会增加很多。

建立一个主窗口

import  sys
from PyQt5.QtWidgets import QApplication,QWidgetapp=QApplication(sys.argv)
window=QWidget()
window.resize(300,200)
window.move(250,150)
window.setWindowTitle('Hello PyQt5')
window.show()
sys.exit(app.exec_())

image
代码分析:

# -*- coding:UTF-8 - *-

这行代码是为了避免在所生成的PyQt程序中出现中文乱码问题。

什么是UTF-8?
UTF-8(8-bit Unicode TransformationFormat)是一种针对Unicode的可变长
度字符编码,又称“万国码”,由Ken Thompson于1992年创建,现在已经标准化
为RFC 3629。UTF-8用1~4个字节编码Unicode字符,用在网页上可以统一页面
显示中文简体/繁体及其他语言(如英文、日文、韩文)0提倡使用UTF-8编码方案,
这样PyQt程序就可以在多个平台(如Windows、Linux等)下正常显示中文了。

import  sys
from PyQt5.QtWidgets import QApplication,QWidget

这两行代码用来载入必需的模块。在Qt5中使用的基本的GUI窗口控件都在
PyQt5.QtWidgets模块中。

app=QApplication(sys.argv)

每一个PyQt程序都需要有一个QApplication对象,QApplication类包含在
QTWidgets模块中。sys.argv是一个命令行参数列表。Python脚本可以从Shell中执
行,比如双击.PY脚本文件,通过参数来选择启动脚本的方式。

window=QWidget()

QWidget控件是PyQt5中所有用户界面类的父类。这里使用了没有参数的默认
构造函数,它没有继承其他类。我们称没有父类的控件为窗口。
需要注意的是,窗口和控件都继承自QWidget类,如果不为控件指定一个父对
象,那么该控件就会被当作窗口处理,这时setWindowTitle()和setWindowlcon()函
数就会生效。

window.resize(300,200)

使用size()方法可以改变窗口控件的大小,在这里设置窗口的宽度为300像素,
高度为200像素。

使用move()方法可以设置窗口初始化的位置(x,y)。
窗口的坐标系统就像手机屏幕一样,在IOS、Android和Windows Phone的UI
坐标布局中:
坐标系统在屏幕左上角,(0,0)为原点。
x是从左到右递增的。
y是从上到下递增的。
显示效果如4-11所示。

window.setWindowTitle('Hello PyQt5')

这行代码用来设置窗口控件的标题,该标题将在窗凵的标题栏中显示。

window.show()

使用show()方法将窗口控件显示在屏幕上。

sys.exit(app.exec_())

最后进入该程序的主循环。事件处理从本行代码开始,主循环接收事件消息并
将其分发给程序的各个控件。如果调用exit()或主控件被销毁,主循环就会结束。
使用sys.exit()方法退出可以确保程序完整地结束,在这种情况下系统的环境变量会
记录程序是如何退出的。

如果程序运行成功,那么exec_()的返回值为0,否则为非0。

最后进入该程序的主循环。事件处理从本行代码开始,主循环接收事件消息并
将其分发给程序的各个控件。如果调用exit()或主控件被销毁,主循环就会结束。
使用sys.exit()方法退出可以确保程序完整地结束,在这种情况下系统的环境变量会
记录程序是如何退出的。

为什么程序主函数的返回值为0?
无论是C还是C++,从main函数返回的结果都相当于调用了exit函数,main
的返回值会作为传给exit函数的参数。
exit对参数的说明如下:
如果参数为0或EXIT_SUCCESS,则向外部环境报告程序运行圆满结束。
如果参数为EXIT_FAILURE,则向外部环境报告程序运行以失败告终。
如果参数为其他值,则结果由实现定义。
所以,return 0是有确定语义的返回方式,而return 1则不具备可移植性。PyQt
5的底层使用的就是C++,所以不难理解为什么主函数执行成功后exec_()的返回
值为0了。

有关exec_()的下画线问题解释如下:
QApplication类的exec_()函数来自于PyQt4及前版本,因为在Python2中,
exec是Python的关键字,为避免冲突,PyQt5使用了exec_()这个名称·这个问题在Python3中己经解决,所以如果你的代码只在Python3下运行,那么完全可以写成.

app.exec_()

当然,为了保持向后兼容,带有下画线的函数还是可以使用的,在本书后面的
代码中将保持这种风格。

上一节中我们学习了如何创建一个最简单的PyQt5应用,在这一节中将介绍如
何为PyQt5应用添加个性化图标。

程序图标就是一个小图片,通常显示在标题栏的左上角。本书中所有PyQt应用
使用的图标,都是从easyicon网站(http://www.easyicon.net/)免费下载的。easyicon
网站提供了超过50万个PNG、ICO、ICNS格式的图标搜索、图标下载服务,可以
免费使用。

设置程序图标

import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget,QApplicationclass Icon(QWidget):def __init__(self,parent=None):super(Icon,self).__init__(parent)self.initUI()def initUI(self):self.setGeometry(300,300,250,150)self.setWindowTitle('演示程序图标例子')self.setWindowIcon(QIcon('./images/cartoon1.ico'))if __name__ == '__main__':app=QApplication(sys.argv)icon=Icon()icon.show()sys.exit(app.exec_())

运行效果

image
第一个PyQt5应用示例代码是采用面向过程的风格编写的,而这个应用示例代
码采用的是面向对象的风格,Python同时支持面向过程和面向对象编程。PyQt编程
的精髓是面向对象编程,这意味着在随后的开发中将转向面向对象的编程风格。

在面向对象编程中最重要的是类、属性和方法。在第1组代码中,创建了一个
名为lcon的新类,该类继承自QWidget类,因此必须调用两个构造函数——-Icon的
构造数和继承类QWidget的构造函数。

在第2组代码中,定义了初始化界面方法initUI(),使用QWidget类的setGeometry()
方法完成了两个功能一一设置窗口在屏幕上的位置和设置窗口本身的大小。它的前
两个参数是窗口在屏幕上的x和y坐标;后两个参数是窗囗本身的宽度和高度。

使用setWindowIcon()方法来设置程序图标,它需要一个QIcon类型的对象作为
参数。在调用QIcon构造函数时,我们需要提供图标路径(相对路径或绝对路径)。
同时注意,使用QIcon类型必须导入此模块:fromPyQt.QtGui import QIcon。

显示气泡提示信息

在设计界面时应尽可能人性化,对于关键的操作,给出相关信息的提示会非常
有用。

import sys
from PyQt5.QtWidgets import QWidget, QToolTip , QApplication
from PyQt5.QtGui import QFontclass Winform(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):QToolTip.setFont(QFont('SansSerif', 10))self.setToolTip('这是一个<b>气泡提示</b>')self.setGeometry(200, 300, 400, 400)self.setWindowTitle('气泡提示demo')           if __name__ == '__main__':app = QApplication(sys.argv)win = Winform()win.show()sys.exit(app.exec_())

代码分析:
在本例中,我们为一个QWidget类型的窗口控件设置气泡提示。

self.setToolTip('这是一个<b>气泡提示</b>')

要创建工具提示,则需要调用setToolTip()方法,该方法接受富文本格式的参数。

QToolTip.setFont(QFont('SansSerif', 10))

通过此行语句设置气泡提示信息的字体与字号大小。

相关文章:

  • 使用FastAPI和React以及MongoDB构建全栈Web应用04 MongoDB快速入门
  • 【小记】excel vlookup一对多匹配
  • adb 实用命令汇总
  • 路由重发布
  • 在UniApp中css实现蚂蚁森林点击抖动效果的完整指南
  • [Linux]多线程(二)原生线程库---pthread库的使用
  • JVM——即时编译器的中间表达形式
  • LVGL图像导入和解码
  • vllm笔记
  • 《基于人工智能的智能客服系统:技术与实践》
  • Python 包管理新选择:uv
  • 栈溢出攻击最基本原理
  • MySQL 1366 - Incorrect string value:错误
  • 采用SqlSugarClient创建数据库实例引发的异步调用问题
  • 动态规划:最长递增子序列
  • Python企业级OCR实战开发:从基础识别到智能应用
  • JMeter 中实现 双 WebSocket(双WS)连接
  • 前端EXCEL插件,智表ZCELL产品V3.0 版本发布,底层采用canvas全部重构,功能大幅扩展,性能极致提升,满足千万级单元格加载
  • openlayers利用已知的三个经纬度的坐标点 , 绘制一个贝塞尔曲线
  • JDBC执行sql过程
  • 人民日报读者点题·共同关注:今天我们为什么还需要图书馆?
  • 竞彩湃|德甲欧冠资格竞争白热化,伯恩茅斯主场迎恶战
  • 央行:中国政府债务扩张仍有可持续性
  • 人民财评:网售“婴儿高跟鞋”?不能让畸形审美侵蚀孩子身心
  • 视频丨习近平同普京会谈:共同弘扬正确二战史观,维护联合国权威和地位
  • 牛市早报|央行宣布降准降息,公募基金改革最新方案落地