什么是PyQT
Qt是一个跨平台的C++应用程序开发框架,主要用于开发跨平台的GUI程序。Qt和MFC都 可以用于开发GUI桌面程序 ,但是QT的优势在于其强大的跨平台性。使用QT框架开发的GUI程序在其它平台经C++编译器重新编译即可正常运行。但是Qt不单单可以用于开发GUI程序,它还有跨平台的套接字接口,多媒体接口,数据库接口有等等。
PyQt是Python2.x和Python3.x绑定QT应用框架的一系列模块和类的接口集合,PyQt可以运行在所有的Qt支持的平台上,比如Windows,OS X,Linux,iOS 以及Andoid。PyQt5 支持Qt 5,而PyQt4支持Qt4。
为什么PyQt是绑定QT应用框架的一系列模块和类的接口?这是因为Qt内部提供的原生API都是基于C++的。PyQt的Qt相关函数最终都是落实到调用这些C++语言的API,所以Python需要定义所有的PyQt函数和Qt函数之间映射,把PyQt里面的一个函数绑定到Qt内部的某个函数上。
(Py)QT的优势
- PyQT的API与原生QT的API类似,QT的文档一般可以用于PyQt.所有PyQT开发文档比Python其它的GUI库是要多得多。
- 跨平台,PyQt编写的GUI程序的移植性特别好。
- PyQt熟悉后可以很方便地转到C++阵营开发Qt程序。
- PyQt有其它一些周边工具可以加速开发,例如可以使用Qt Designer,可以使用拖拽控件的方式来设计界面,这一点是比较方便的。
- Qt的控件特别相比Tkinter,PyGTK要多得多
缺点
- Qt使用信号槽机制来实现不同GUI控件之间的信息传递与函数调用,与传统的基于触发事件然后调用回调函数的机制有很大的不同。这一点需要花额外的时候进行学习。但是这一点正是Qt能够跨平台的核心所在。
- 需要一定的C++知识 ,操作系统的知识作为基础,以便阅读Qt文档和理解PyQt的行为。
使用(Py)Qt的著名应用程序
Google Earth
Opera:欧朋浏览器
Skype:国外流利的聊天软体
YY语言:又名“歪歪语音”,是一个可以进行在线多人语音聊天和语音会议的免费软件。在中国大陆拥有庞大的用户群。
咪咕音乐:咪咕音乐是中国移动倾力打造的正版音乐播放器
WPS Office:金山公司(Kingsoft)出品的办公软件,与微软Office兼容性良好,个人版免费。
Doxygen:API文件产生器
···
主要是一些跨平台的应用
PyQt的主要模块
QtCore—QtCore模组是所有基于Qt的应用程序的基础,提供信号与槽的之间通讯机制、IO、事件处理、多进程等等。
QtGui—包含了开发GUI程序的基本功能。
QtMultimedia—提供了用于多媒体内容处理的QML类型集和C++类集。同时提供访问摄像头及音频功能的API。包含的Qt音频引擎支持三维音频回放及管理。
QtNetwork—提供了网路程序设计功能。
QtOpenGL—提供在应用程序中使用OpenGL和OpenGL ES加入3D图形的功能。
QtSql—数据库结口。支持的数据库有:ODBC、MySQL、PSQL、SQLite、ibase、Oracle、Sybase、DB2。
QtWebKit—整合WebKit,提供了HTML浏览器引擎,便于在应用程序中嵌入web内容和服务。
QtXml—提供了XML文档的阅读器和编写器、支持SAX和DOM。
QtXmlPatternsl—提供了XQuery和XPath引擎支持。
Webkit—提供HTML的解析功能,可以基于此开发定制的web浏览器。
···
通过这些模块,我们可知PyQT支持的功能,粗略来看PyQt提供的功能是相当丰富。
PyQt4与PyQt5
根据官方介绍,Qt5高级兼容Qt4,Qt5是Qt4的一个“伪超集”,绝大部分Qt4上支持的功能Qt5也支持。Qt5主要新增了一些对移动端的支持,使用Qt5即可以开发桌面风格的程序,也可以开发移动端风格的程序。
使用在选择使用PyQt5还是PyQt4的时候,个人建议优先选择PyQt5。
Qt的信号槽机制简介
信号与槽用于对象间的通信,该机制是Qt的一个重要特性。在GUI程序编程中,经常需要将一个窗口控件的变化通知给另外一个窗口的控件,或者同一个窗口之间的不同控件之间进行通信。一般的GUI编程框架采用回调函数的方式进行控件之间的通信,回调函数里面再写上具体的处理逻辑,回调和处理函数捆绑在一起,这种回调函数机制没有信号槽简单和灵活。
信号槽其实包含信号Signal以及槽Slot。Signal用于发信号,Slot用于接收信号。Signal只管发信号,不管到底有没有Slot接受这个信号。
Signgal信号是一个特殊的函数原型,这个函数原型(函数名以及函数参数列表)由开发者定义。当这个信号函数f被调用的时候,就会发送信号。发出的信号包含两种信息:
函数f被调用了,暗示与函数f相关的事件已发生(定性)
通过函数f参数可以得到f绑定的事件具体改变了什么东西,改变了多少(定量)。注意函数f只定义函数原型并不定义函数实现。
Slot则是用于接受信号的函数。Slot是一个完整的函数,它具有函数原型以及函数实现。Slot的函数参数列表其实是与它所要接受的Signal函数参数列表是一致的(参数个数,参数类型一致,与参数名无关)。Slot接收到信号Signal后,即可得到Signal发来的实参数据,然后基于这些实参数据进行加工处理。
单单只有Signal和Slot,还不足以完成控件之间的通信。还需要某个全局性的“管理员”来告诉不同的信号和槽:哪个信号可以和哪个槽绑定。这个过程通过调用connect函数来完成。
举个例子:
上面共有三个控件:姓名编辑控件,年龄编辑控件,个人信息展示控件。
当姓名编辑控件的姓名改变后,开发者让该控件发送一个changeName(string)的信号(其实是以特殊的方式调用这个函数,调用方式类似于:emit changeName(“jmh”))。
changeName这个信号的发出表示:“姓名已经改变”(定性),同时姓名该成了“jmh”(定量)。
然后开发者又通过Connect将姓名编辑控件的changeName信号和个人信息展示的SetName槽绑定在一起。个人信息展示控件最后知道它现在应该将个人信息的姓名显示成“jmh”。
年龄编辑控件的changeAge这个信号的发送和接收也是类似。值得注意的是,该控件的Error信号并没任何槽接收。这在Qt是合法的,而且这个情况在现实世界中也是合理的,毕竟“我们可以随便说各种奇怪的话,但是不一定所有话都会有人去听”。这种操作在MFC中是不方便处理的。
PyQt安装
pip3 install pyqt5
其它
- 为了更好的使用pyQt,可以
1.使用Eric IDE:专门用PyQt进行优化过的python IDE
http://eric-ide.python-projects.org/
2.使用QtDesinger:支持拖过拖拽控件来设计Gui界面的
http://pyqt.sourceforge.net/Docs/PyQt5/designer.html - 是否免费
PyQt分免费和商业版。
商业版主要提供的服务有:
PyQtChart, PyQtDataVisualization(图表以及数据可视化), PyQtPurchasing(支付模块), dip or QScintilla2 模块功能 以及所有开发过程中的技术支持。