PyQt5系列(1)初识、环境搭建

1 简介

PyQt5是一套Python绑定Digia QT5应用的框架,是最强大的GUI库之一,适用于Python2和Python3。本系列使用Python 3.6.2

PyQt5做为Python的模块,拥有620多个类、6000个函数和方法。而且是一个跨平台的工具包,它可以运行在所有主流的操作系统,包括UNIX,Windows,Mac OS。PyQt5是双重许可,开发者可以在GPL(通用公共许可证,General public license)和商业许可之间进行选择。

注意,PyQt5并不向下兼容PyQt4。部分改变如下:

  • Python模块已经重组。一些模块已经删除(qtscript),有的被分割成子模块(QtGui,QtWebKit)。
  • 新的模块作了详细的介绍,包括qtbluetooth,qtpositioning,或enginio。
  • pyqt5只支持新型的信号和槽handlig。电话signal()或slot()不再支持。
  • pyqt5不支持Qt的API被标记为过时或陈旧的任何部分在QT V5.0。

2 PyQt5 模块

PyQt5的类被分成了很多模块,包括如下的模块:

  • QtCore:包含了核心的非GUI功能。此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程。
  • QtGui:用于窗口系统集成、事件处理、二维图形、基本成像、字体和文本的类。
  • QtWidgets:提供了一整套UI元素组件,用于创建经典桌面风格的用户界面。
  • QtMultimedia:包含用于处理多媒体内容,通过调用API接口访问摄像头、语音功能。
  • QtBluetooth:包含用于扫描设备并与设备连接和交互的类。
  • QtNetwork:包含用于网络编程的类库,这些类简化了通过TCP/IP和UDP进行的客户机和服务器的编码,使网络编程更简单、更可移植。
  • QtPositioning:包含通过使用各种可能的源(包括卫星、Wi-Fi或文本文件)来确定位置的一些类。
  • Enginio:实现了用于访问Qt云服务管理应用程序运行时的客户端库。
  • QtWebSockets:包含实现WebSocket协议的类。
  • QtWebKit:包含基于WebKit2库的web浏览器的实现类。
  • QtWebKitWidgets:包含基于WebKit1的web浏览器实现的类,用于基于QtWidgets的应用程序。
  • QtXml:包含处理XML文件的类,此模块实现了SAX和DOM api。
  • QtSvg:提供了显示SVG文件内容的类。可缩放矢量图形(SVG)是一种用XML描述二维图形和图形应用程序的语言。
  • QtSql:提供了处理数据库的类。
  • QtTest:包含启用PyQt5应用程序单元测试的功能。

3 PyQt5 早期版本兼容性

3.1 PyQt v5.12

转换整数时的溢出检查
在以前的版本中,PyQt5在将Python int对象转换为c++整数类型时没有执行溢出检查。发生溢出时的行为未定义。
此版本执行溢出检查,并在检测到溢出时抛出适当的异常。
可以通过调用PyQt5.sip.enableoverflowchecking(False)()来关闭溢出检查。

3.2 PyQt v5.11

引入sip模块
在以前的版本中,PyQt5使用了通常安装在site-packages目录中的sip模块的副本,应用程序通过以下方式访问它:

import sip

此版本包括模块的私有副本。应用程序应按如下方式访问它:

from PyQt5 import sip

作为向后兼容性,模块仍然可以像以前一样导入,但这仅在先导入另一个PyQt5模块时才有效。例如,以下有效:

from PyQt5 import QtCore
import sip

但是,如果import语句的顺序颠倒过来,无效。

3.3 PyQt v5.6

将Latin-1字符串转换为QByteArray
该版本在预期使用QByteArray时,删除了Latin-1编码的字符串的自动转换。它在PyQt v5.4中被弃用。

Python未处理的异常
在很多情况下,Python代码都是从c++中执行的。c++虚拟方法的Python重实现可能是最常见的例子。在以前的版本中,如果Python代码引发了异常,那么PyQt将调用Python的PyErr_Print()函数,该函数将调用sys.excepthook。在PyQt v5.5中,未处理的Python异常将导致调用Qt的qFatal()函数。默认情况下,这将调用abort(),应用程序将终止。

3.4 PyQt v5.3

Python插槽的执行
在以前的版本中,当信号被发送到没有使用pyqtSlot()的Python槽中时,不会检查底层的c++ receiver实例是否仍然存在。这与PyQt v5.0发布时的PyQt v4行为相匹配,但并不反映标准的c++行为。
缺少检查意味着对象可以将其销毁的信号连接到自身,以便在其底层c++实例被销毁时进行监视。不幸的是,对于更常见的代码来说,这是一个潜在的bug来源。
在这个版本中,已经引入了检查,因此为依赖于早期行为的任何代码创建了不兼容性。作为一个解决方案,no_receiver_check参数被添加到connect中,它允许在每个连接的基础上禁止检查。

默认参数的Qt信号
在以前的版本中,带有默认参数的Qt信号被外露为多个信号,每个信号有一个额外的默认参数。例如,QAbstractButton::clicked(bool checked = false)被外露为QAbstractButton::clicked(bool checked)QAbstractButton::clicked(),前者为默认信号。因此,可以使用空元组作为键来索引后者——尽管这样做没有任何好处。
在这个版本中,只有带有所有参数的信号是公开的。但是信号的emit()方法仍然支持默认参数,也就是说,当正常使用时,应该不会注意到变化。

4 PyQt5 安装

安装GPL版本:

pip install PyQt5

可能会报错ERROR: Could not find a version that satisfies the requirement PyQt5 (from versions: none) ERROR: No matching distribution found for PyQt5

1578909773.jpg
这是因为网络的问题,需要使用国内的镜像源来加速,比如豆瓣源

pip install PyQt5 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

也可以使用 -i https://pypi.tuna.tsinghua.edu.cn/simple等等

测试。创建Sample.py,填入以下内容,并保存文件

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Sample')
    w.show()

    sys.exit(app.exec_())

python Sample.py运行,出现如下窗口,即代表安装成功。

1578916167.jpg

-----------本文结束啦-----------

原文链接

💡 更多好文欢迎关注我的公众号~

公众号

推荐阅读更多精彩内容