通俗理解Qt for Python的模块结构

本文来自于州的先生在线教程《一看就懂的Python图形界面编程》的第二篇,更多精彩教程请前往州的先生在线教程进行学习。

在安装完成PyQt5/PySide2之后,我们先不急着开始进行Python图形界面的编程。因为现在我们对PyQt5和PySide2还一无所知。

PyQt5和PySide2都是QT图形界面开发包的Python封装模块,它们最大程度地利用Python编程语言还原了QT在原生C++下实现的功能和定义。所以我们使用PyQt5或是PySide2都可以较完整地在Python编程语言中完成QT的图形界面应用开发。

同时,由于PyQt5和PySide2的发展历史、授权协议等有所差异,所以我们在此建议大家对两者进行如下选择:

  • 如果只是想快速学习在Python中进行图形界面编程或者开发的是开源非商业用途的图形界面应用程序,那么推荐大家选择PyQt5;
  • 如果开发的图形界面应用程序未来可能用作商业用途,那么建议大家使用PyQt5进行开发,然后将其转换为PySide2代码,最后进行打包;
  • PySide2在Qt官方的大力支持下,各方面已经越来越完善,可以尝试完全使用PySide2。

所以在本系列教程中,为了方便演示,我们使用PyQt5进行知识点示例代码的讲解。如果有读者对PySide2的代码有需求,可以自行替换。(对于大多数子模块而言,只需要简单的将模块引入中的PyQt5替换为PySide2即可,其他特殊模块则可以参考官网文档说明)。

在开始使用PyQt5/PySide2进行Python图形界面编程之前,我们先来了解一些我们即将使用的图形界面开发模块的结构。就像对房屋进行装修之前,只有对房屋的结构、构成有了了解,才能更好的进行施工。

PyQt5/PySide2作为一个大型的模块,不像一些小的模块只有极少数的子类和方法属性,其拥有大量的子模块、定义和对象,如果不对其全局的结构有一个了解,就会陷入不知从何开始的困局。

一、PyQt5/PySide2的子模块

在安装完成PyQt5/PySide2之后,我们就可以在IDE或代码编辑器中通过from……import……,或直接的import对其进行引入使用了。

在IDE中使用from语法引入PyQt5/PySide2,代码如下所示:

from PyQt5 import Q

如果你使用的IDE或代码编辑器有智能提示功能,那么就会显示PyQt5模块下的以Q开头的子模块,如下图所示:

 

因为QT模块的风格就是子模块都是Q开头,所以IDE智能提示中显示的子模块基本上包含了PyQt5中所有的子模块。

这些子模块包含但不限于以下模块:

QtCore,QtWidgets,QtGui,QAxContainer,QtBluetooth,QtDBus,QtDesigner,QtHelp,QtLocation,QtMultimedia,QtMultimediaWidgets,QtNetwork,QtNetworkAuth,QtNfc,QtOpenGL,QtPositioning,QtPrintSupport,QtQml,QtQuick,QtQuickWidgets,QtRemoteObjects,QtSensors,QtSerialPort,QtSql,QtSvg,QtTest,QtWebChannel,QtWebSockets,QtWinExtras,QtXml,QtXmlPatterns

在这些模块中,大致可以分为以下几个类别:

  • 基础模块,这一类的模块都是通用且核心的,对于大多数的QT应用程序来说都是用得着的模块;
  • QT功能模块,这一类模块是用于具体用途和功能开发所使用到的模块;
  • QT工具模块,这类模块属于QT提供的用于提高图形界面开发效率的工具;

下面我们分别来认识一下几类模块。

、通用基础模块——房屋的基石

在PyQt5的通用基础模块中,又分为核心基础模块和一般性基础模块。这个其实很好理解,核心基础模块,相当于一栋房子的地基、承重梁、水泥砖头等等,用于搭建起房屋的基本结构;

属于基础模块的子模块有以下模块:

  • QtCore:这个是PyQt5中的其他模块使用到的核心非图形类。这个模块就像是建造房屋的地基和钢筋,为健壮的图形界面程序提供核心且强大的功能支持,其提供了诸如线程(QThread、QThreadPool)、动画(QAbstractAnimation)、事件响应(pyqtSignal、pyqtSlot、QEvent)、输入/输出对象(QSettings、QFileinfo)等功能。一个使用PyQt5编写的图形界面程序可以不使用QtCore模块,但是一个PyQt5编写的强大图形界面程序,肯定会使用到QtCore模块。
  • QtGui:这个是PyQt5中图形用户界面组件的基类。其提供了用于图形窗口集成、图形事件处理、2D图形图像、字体和文本的子类。有诸如图形拖放(QDrag、QDropEvent)、图像显示(QBitmap、QImage)、字体定义(QFont)、颜色定义(QColor)、绘笔(QPen)等等的子类,类似于建造房屋时的墙面修砌。
  • QtWidget:这个是PyQt5中扩展了QtGui模块的控件模块,所谓控件模块,就是其提供了大量的控件及其布局类。这就相当于房子里面客厅、厨房、阳台、卧室,以及其中的各种家具、摆件、电器、设备等等。我们在图形界面编程过程中会使用到大量的QtWidget中的子类,图形界面程序中的窗口、按钮、输入框、文本框、选择框、布局等等都是使用它的子类。如同建造房子,我们没有地基(QtCore)、不用水泥砌墙(QtGui),也能用木板和树叶(QtWidget)搭建出一个简易的小屋出来。

上述的三个子模块,是PyQt5中传统图形界面程序编程涉及到的核心模块。

注意:我们知道,原生的Qt使用的是C++语言进行图形界面的开发,从Qt4.7开始,Qt中引入了一种新的图形界面开发语言——QML作为原生QT开发语言C++的替代品,同时其构建了一套名为QtQuick的类库,用于使用自定义图形界面来构建高度动态的图形界面应用程序。其属于Qt开发的另一个分支,Qt的Python封装包中也包含了相关的模块支持,但是在本系列教程中,我们只使用传统Qt图形界面开发的模块。

我们再来看看功能模块。

功能模块——扩展房屋属性

在功能模块中,也分为基础功能模块和其他功能模块。

基础功能模块,其重要程度低于核心基础模块,但是又高于其他功能模块。随着时代的发展,需求的变动,一个功能模块可能会升级为基础功能模块,也有可能降级为其他功能模块。同理,一个其他功能模块也有可能变为基础功能模块。

就像几十年前,家家户户通上电是一个追求的目标,网络也只是家庭才有的配置。而现在,每家每户都有电,并且网络已经成为了标配。

在当前版本,基础功能模块包含了如下模块:

  • QtMultimedia:一个多媒体模块,提供对音频、视频、无线电广播和相机功能的支持;
  • QtMultimediaWidgets:一个用于实现多媒体功能的控件模块,提供了设计视频和摄像头额外的控件支持,其扩展了QtMultimedia和QtWidget模块的功能;

上述两个功能模块都是用来实现多媒体功能的。

  • QtNetwork:一个用于实现网络编程的模块,使得在Qt图形界面中进行网络编程变得更加方便;
  • QtSQL:一个用于在Qt中使用SQL对数据库进行操作的模块;
  • QtTest:一个用于对Qt图形界面程序进行单元测试的模块;

上面我们说过,基础功能模块和其他功能模块就像电和网络一样,在不同的时期的重要性会有不同的变化。

无论其变化几何,这些模块终究是为了扩展图形界面程序的功能而生。下面我们来看看PyQt5中的部分其他功能模块:

  • QtNfc:这个模块提供了对近场通信(NFC)硬件进行访问的支持;
  • QtWebEngine:这个模块借助开源的Chromium浏览器项目,在图形界面应用程序中嵌入Web浏览功能;
  • QtWebSocket:这个模块为图形界面程序提供了WebSocket通信的功能;
  • QtSvg:这个模块提供了用于显示SVG文件内容的相关功能;

对功能模块的细分并不需要特别严谨,因为从某种程度而言,除了核心模块之外的模块都属于功能模块。核心模块用于打好图形界面程序的基础,功能模块无论是基础功能还是其他功能,都是用于实现图形界面程序的功能,一个定义为其他功能模块的模块在自己的图形界面编程过程中的使用频率和重要程度都高于一个基础功能模块。所以大家灵活运用即可。

、工具模块

Qt的工具模块主要是为了方便开发人员对图形界面程序进行设计和开发,其提供了Qt设计师(QtDesigner)这个图形化的程序设计工具,能够便捷地利用鼠标拖拽来快速绘制程序的界面和基础的事件响应。

为了便于大家对PyQt5各个模块代码的理解,本系列教程将不使用Qt设计师来设计和绘制图形界面,有需要的读者可以自行下载安装使用QT设计师。

、其他模块

上述几个小节内容中介绍的模块并没有列出Qt的所有模块来,在Qt的官方文档上其有一个链接列出了所有的模块的介绍,有需要的读者可以前往查阅:https://doc.qt.io/qt-5/qtmodules.html

同时,由于Qt的Python封装包(PyQt5和PySide2)对Qt模块API的封装并非全部移植封装,两个包中都存在缺少原生Qt模块的情况。在Qt for Python的文档上,同样也列出了PySide2中包含的所有模块,有需要的读者可以前往查阅:https://doc.qt.io/qtforpython/modules.html

猜你也喜欢

发表评论

邮箱地址不会被公开。