PyQt5|正确导入模块中的类

1.PyQt5的常用模块

PyQt5是Qt C++类库的一个Python绑定,它包含了很多模块,在PyQt5安装后的目录“D:\Python37\Lib\site-packages\PyQt5”里可以看到所有模块的文件。在前面的示例程序中已经用到了QtWidgets、QtCore、QtGui等模块,PyQt5中常用的几个模块如表所示

PyQt5|正确导入模块中的类插图

2.查找类所在的模块

在Python程序里用到某个PyQt5的类时,需要用import语句导入这个类,例如在前面的示例程序中用过这样的导入语句:

from PyQt5.QtWidgets import  QApplication, QWidget
from PyQt5.QtCore import  pyqtSlot, pyqtSignal
from PyQt5.QtGui import  QIcon

因为Qt的类一般都以大写字母Q开头作为类名,与Python自带的类或其他程序包的类有很好的区分度,所以一般导入具体的类,然后在程序里直接使用这个类。
尽量不要使用类似于这样的导入语句:

from PyQt5.QtWidgets import  *

这样虽然可以导入PyQt5.QtWidgets中的所有类并且直接使用,但是会导入很多不需要用到的类,这可能使程序运行变慢。
对于一个具体的类,如何知道它属于哪个模块呢?例如,对于类QPalette,如何知道它属于哪个模块,从而使用正确的import语句呢?
Qt C++的类库也是以模块组织的,Qt C++类库中的模块与PyQt5中的模块基本是对应的,可以在Qt Creator的帮助页面查找一个类的详细资料来查到其属于哪个模块。例如,QPalette类的帮助信息的基本描述如图所示,其中有一行是:

qmake:  QT += gui
PyQt5|正确导入模块中的类插图1

这表明在Qt C++类库中,QPalette是属于gui模块的,那么在PyQt5中对应的模块就是PyQt5.QtGui,所以导入语句应该是:

from PyQt5.QtGui import  QPalette

Qt帮助文档中qmake语句常见的描述与PyQt5模块的对应关系如表所示。

PyQt5|正确导入模块中的类插图2

3.部分类和接口函数的差异

PyQt5中大部分类的接口函数,以及每个函数的输入输出参数定义与Qt C++类库中的是一致的,所以在Qt Creator中查询帮助信息就可以知道类的接口或一个函数的输入输出参数。
但是有少量PyQt5的类或接口函数与Qt C++类库中的是不一样的。例如,对于QDataStream类,Qt C++类库中使用流操作符“>>”和“<<”实现各种类型数据的输入和输出,但是PyQt5中的QDataStream类没有这两个流操作符,而是定义了很多接口函数进行各种数据的输入和输出
另外,有少量函数的接口在PyQt5和Qt C++中的定义不一样。例如,QFileDialog类的getOpenFileName()在Qt C++中的函数原型(省略了输入参数)是:

QString  getOpenFileName(…);

而用help()指令查看的PyQt5中的函数原型(省略了输入参数)是:

getOpenFileName(…) -> Tuple[str, str]

getOpenFileName()函数在Qt C++和PyQt5中的输入参数相同,所以上面都省略了输入参数的显示。但是在Qt C++中,getOpenFileName()函数只返回一个选择的文件名,而在PyQt5中,getOpenFileName()返回一个Tuple类型的数据,第一个str类型数据是选择的文件名,第二个str类型数据是使用的文件过滤器。如果直接按照Qt C++中的函数原型在Python中使用QFileDialog.getOpenFileName()函数就会出现问题。
在Qt C++类库和PyQt5之间存在差异的类和接口函数并不多,但如果不知道这些差异,按照Qt C++类库的接口定义来使用PyQt5中的相应类或函数就会出现问题。例如,只根据Qt帮助文档里的函数原型使用PyQt5中的类或函数,或者是熟悉Qt C++类库使用的读者根据经验使用这些有差异的类或函数。

下面是整理的示例程序或使用PyQt5过程中遇到过的有差异的类或函数,这不是覆盖整个PyQt5的清单,不全面,但是可以让读者遇到此类问题时避免落入陷阱耗费时间。下面整理的内容只是列出了这些有差异的类或函数,并做简单说明,至于具体的差异之处,书中示例程序中涉及的地方会有具体说明。读者在用到以下这些类或函数时,也可以查阅Qt C++帮助文档和PyQt5内置帮助信息来明确这些差异之处。
(1)QDataStream类:接口函数存在较大差异,Qt C++中使用流操作符“>>”和“<<”, PyQt5中使用大量的接口函数替代流操作符。
(2)QFileDialog类:三个类函数getOpenFileName()、getOpenFileNames()、getSaveFileName()的返回数据有差异。Qt C++中只返回文件名或文件名列表,而PyQt5中返回的是一个Tuple类型的数据,第一个元素是文件名或文件名列表,第二个元素是使用的文件名过滤器。
(3)QFontDialog类:类函数getFont()的输入参数、返回数据有差异。
(4)QInputDialog类:getText()、getInt()等类函数返回数据有差异。
(5)QMediaRecorder类:supportedAudioSampleRates()函数返回数据有差异。

4.数据类型对应关系

C++是强制类型定义的语言,Python是动态数据类型语言,而且两种语言之间的数据类型有一些差异。例如对于字符串数据,Python有内建的str类型,而Qt C++中使用QString类。
Qt C++类库转换为PyQt5后,某些Qt C++中的数据类型与Python中的数据类型存在对应关系,知道这些常见的对应关系后,就可以根据Qt Creator里查到的Qt C++函数原型迅速知道Python中的函数原型,从而正确使用这些函数。
1.枚举型常数
Qt C++的名称空间(namespace)Qt包含大量的枚举类型的定义,例如,表示预定义颜色的枚举类型:

enum Qt::GlobalColor

其部分枚举值有Qt::white、Qt::black、Qt::red、Qt::blue等。
PyQt5.QtCore模块中的类Qt对应于Qt C++类库中的名称空间Qt,这些枚举类型常量都通过类属性访问,例如预定义颜色常量Qt.white、Qt.red等。
在Qt C++中,也经常在类里定义枚举类型,例如QPalette类定义的用于表示颜色角色的枚举类型:

enum QPalette::ColorRole

其部分枚举值有QPalette::Window、QPalette::Text等。
在PyQt5中,对应的枚举类型就是QPalette.ColorRole,而这些枚举类型常量作为类属性访问,也就是QPalette.Window、QPalette.Text等。


2.Qt C++中的QString与Python的str类型
PyQt5中没有QString类型,Qt C++中的QString会被自动转换为Python的str类型,例如,C++中的一个函数返回值是QString类型:

QString QFileDialog::getExistingDirectory(…);

在PyQt5中的返回值就是str类型:

getExistingDirectory(…) -> str

由于返回结果是Python的str类型,不能使用QString的接口函数对返回结果进行处理,而应该使用Python的str类型的接口函数。


3.列表类型
在Qt C++中用QList定义类型为type的数据列表,而在Python中有内建的list数据类型,所以,Qt C++中的QList在PyQt5中对应的是list[type]数据。例如,Qt C++中用于表示字符串列表的是QStringList类,在PyQt5中没有这个类,而是转换为list[str]数据。
例如,Qt C++中QFileDialog.getOpenFileNames()函数用于返回选择的多个文件的列表,其C++函数原型定义(省略了输入参数)是:

QStringList  getOpenFileNames(…);

而在PyQt5的内置帮助信息显示的函数原型(省略了输入参数)是:

getOpenFileNames(…) -> Tuple[List[str], str]

其返回数据是Tuple类型,第一个数据List[str]是选择的文件名称字符串列表,第二个str数据是使用的文件过滤器。所以,这里还存在Qt C++与PyQt5函数参数不一致的问题。
既然返回的结果是list[str],就应该用Python的list数据处理的方法,例如:

fileList, flt=QFileDialog.getOpenFileNames(self, "选择多个文件",
                          "", "Images(*.jpg)")
if (len(fileList)<1):    #fileList是字符串列表
     return
for i in range(len(fileList)):
     print(fileList[i])

版权声明:
作者:RHZ
链接:https://www.rhzhz.cn/?p=668
来源:RHZ | 用文字记录工作和学习生活
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
PyQt5|正确导入模块中的类
1.PyQt5的常用模块 PyQt5是Qt C++类库的一个Python绑定,它包含了很多模块,在PyQt5安装后的目录“D:\Python37\Lib\site-packages\PyQt5”里可以看到所有……
<<上一篇
下一篇>>