上周給大家推薦了新書(shū)Python Qt GUI與數(shù)據(jù)可視化編程,受到了廣大讀者的青睞,很多人問(wèn)我何時(shí)上架?什么時(shí)間預(yù)訂?能不能給發(fā)完整目錄?需要這種知識(shí)很久了等回應(yīng)。今天可以告訴大家,這本書(shū)上架啦!!!!
【京東購(gòu)買(mǎi)】【當(dāng)當(dāng)購(gòu)買(mǎi)】
本書(shū)介紹在Python中使用PyQt5和其他模塊進(jìn)行GUI和數(shù)據(jù)可視化編程的方法。第一部分介紹PyQt5設(shè)計(jì)GUI程序的基本框架,包括GUI應(yīng)用程序的基本結(jié)構(gòu)、窗體UI可視化設(shè)計(jì)與窗體業(yè)務(wù)邏輯的設(shè)計(jì)、信號(hào)與槽的特點(diǎn)和使用等。第二部分介紹GUI程序設(shè)計(jì)中一些主要功能模塊的使用,包括基本界面組件、事件處理、數(shù)據(jù)庫(kù)、繪圖、多媒體等。第三部分先介紹使用PyQtChart和PyQtDataVisualization進(jìn)行二維和三維數(shù)據(jù)可視化設(shè)計(jì)的方法,再介紹將Matplotlib嵌入PyQt5 GUI應(yīng)用程序窗口界面中進(jìn)行數(shù)據(jù)可視化的編程方法。通過(guò)研讀本書(shū),讀者可以掌握使用PyQt5、PyQtChart、Matplotlib等模塊進(jìn)行GUI應(yīng)用程序和數(shù)據(jù)可視化設(shè)計(jì)的方法。
本書(shū)適合具有Python編程基礎(chǔ),并想通過(guò)Python設(shè)計(jì)GUI應(yīng)用程序或在GUI應(yīng)用程序中實(shí)現(xiàn)數(shù)據(jù)可視化的讀者閱讀和參考。
干貨截選:2.6 從Qt C++類(lèi)庫(kù)到PyQt5
2.6.1 幫助信息的查找
1.在Qt Creator中查找?guī)椭畔?
安裝PyQt5時(shí)不會(huì)安裝完整的類(lèi)庫(kù)幫助文檔,PyQt5的在線(xiàn)Reference Guide提供了PyQt5使用中的一些關(guān)鍵技術(shù)問(wèn)題的說(shuō)明,但是關(guān)于具體的某個(gè)類(lèi)的信息并不完整,不如Qt官網(wǎng)上的幫助文檔信息全面。
要離線(xiàn)獲取一個(gè)類(lèi)的詳細(xì)幫助信息,可以使用Qt Creator的幫助窗口。例如,在Qt Creator的幫助窗口里搜索QSpinBox,其資料頁(yè)面如圖2-32所示,這里有對(duì)QSpinBox類(lèi)的簡(jiǎn)單說(shuō)明和主要特性的示例代碼,列出了其所有的屬性、類(lèi)型定義、公共接口函數(shù)、公共槽函數(shù)、信號(hào)等,并且可以查看每一項(xiàng)的詳細(xì)資料。
圖2-32 在Qt Creator的幫助窗口查找類(lèi)的詳細(xì)信息
Qt類(lèi)庫(kù)包含的類(lèi)很多,具體到某個(gè)特定的類(lèi),其屬性、接口函數(shù)、信號(hào)也很多,不可能全部介紹或列出來(lái)。對(duì)任何一種編程語(yǔ)言來(lái)說(shuō),其自帶的幫助文檔的信息都是最全面最準(zhǔn)確的,學(xué)習(xí)時(shí)要善于查找?guī)椭畔ⅰ?
2.在Python中查找?guī)椭畔?
PyQt5安裝后雖然沒(méi)有Qt Creator里那樣詳細(xì)的類(lèi)庫(kù)幫助文檔,但是可以通過(guò)Python的一些基本指令獲取類(lèi)或函數(shù)的內(nèi)置幫助信息。例如,dir()指令可以顯示一個(gè)類(lèi)的所有接口信息;help()指令可以顯示一個(gè)類(lèi)的詳細(xì)接口定義或一個(gè)函數(shù)的原型定義。
例如,要在Python Shell里查看QSpinBox的幫助信息,可執(zhí)行下面的指令:
?
-
>>> from PyQt5.QtWidgets import QSpinBox
-
>>> dir(QSpinBox)
指令dir(QSpinBox)會(huì)列出QSpinBox的所有屬性和方法的名稱(chēng),包括所有從父類(lèi)繼承的屬性和方法。
?
-
>>> help(QSpinBox)
指令help(QSpinBox)會(huì)更詳細(xì)地列出QSpinBox類(lèi)的所有屬性和方法,它會(huì)先列出QSpinBox類(lèi)里新定義的屬性和方法,然后依次列出父類(lèi)的屬性和方法。接口函數(shù)(即方法)會(huì)顯示輸入輸出參數(shù)定義。
help()指令也可以顯示一個(gè)方法的函數(shù)原型(如QSpinBox.setValue()函數(shù))的幫助信息:
?
-
>>> help(QSpinBox.setValue)
-
Help on built-in function setValue:
-
setValue(...)
-
setValue(self, int)
其中的最后一行表示setValue()函數(shù)需要一個(gè)int類(lèi)型的輸入?yún)?shù),沒(méi)有返回值。self是Python中所有類(lèi)的接口函數(shù)的第一個(gè)參數(shù),不看作函數(shù)參數(shù)。
?
-
>>> help (QSpinBox.value)
-
Help on built-in function value:
-
value(...)
-
value(self) -> int
上面顯示的是QSpinBox.value()函數(shù)的幫助信息,最后一行表示value()函數(shù)返回一個(gè)int類(lèi)型的數(shù)據(jù),沒(méi)有輸入?yún)?shù)。
PyQt5的內(nèi)置幫助信息雖然不詳細(xì)、查閱不方便,但是可以提供最準(zhǔn)確的信息,特別是在函數(shù)的輸入輸出參數(shù)定義上。對(duì)于某些類(lèi)或函數(shù),Qt C++類(lèi)庫(kù)中的定義和PyQt5中的定義有差異,應(yīng)該以PyQt5的定義為準(zhǔn)。
2.6.2 正確導(dǎo)入模塊中的類(lèi)
1.PyQt5的常用模塊
PyQt5是Qt C++類(lèi)庫(kù)的一個(gè)Python綁定,它包含了很多模塊,在PyQt5安裝后的目錄“D:\Python37\Lib\site-packages\PyQt5”里可以看到所有模塊的文件。在前面的示例程序中已經(jīng)用到了QtWidgets、QtCore、QtGui等模塊,PyQt5中常用的幾個(gè)模塊如表2-5所示。
表2-5 PyQt5中常用的模塊
PyQt5模塊名 | 主要功能 | 包含的類(lèi)示例 |
---|---|---|
QtCore | 提供核心的非GUI功能的類(lèi),包括常用的名稱(chēng)空間Qt | QFile、QDir、QTimer等Qt中的非界面組件類(lèi) 包含各種枚舉類(lèi)型的名稱(chēng)空間Qt pyqtSlot、pyQtSignal等在PyQt5中引入的函數(shù) |
QtGui | 提供GUI設(shè)計(jì)中用于窗口系統(tǒng)集成、事件處理、繪圖等功能的類(lèi) | QIcon、QFont、QPixMap、QCloseEvent、QPalette、QPainter等GUI底層實(shí)現(xiàn)類(lèi) |
QtWidgets | 提供GUI設(shè)計(jì)中所有窗體顯示的類(lèi),包括各種窗體、標(biāo)準(zhǔn)對(duì)話(huà)框、按鈕、文本框等組件 | QMainWindow、QWidget、QDialog等窗體 QColorDialog、QFileDialog等標(biāo)準(zhǔn)對(duì)話(huà)框 QRadioButton、QSpinBox、QMenu等界面組件 |
QtMultimedia | 提供音頻、視頻、攝像頭操作的類(lèi) | QCamera、QAudioInput、QMedaiPlayer等 |
QtMultimediaWidgets | 提供多媒體窗體顯示的類(lèi) | QCameraViewfinder、QVideoWidget等 |
QtSql | 提供SQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)、數(shù)據(jù)查詢(xún)和操作的類(lèi) | QSqlDatabase、QSqlQuery、QSqlRecord等 |
2.查找類(lèi)所在的模塊
在Python程序里用到某個(gè)PyQt5的類(lèi)時(shí),需要用import語(yǔ)句導(dǎo)入這個(gè)類(lèi),例如在前面的示例程序中用過(guò)這樣的導(dǎo)入語(yǔ)句:
?
-
from PyQt5.QtWidgets import QApplication, QWidget
-
from PyQt5.QtCore import pyqtSlot, pyqtSignal
-
from PyQt5.QtGui import QIcon
因?yàn)镼t的類(lèi)一般都以大寫(xiě)字母Q開(kāi)頭作為類(lèi)名,與Python自帶的類(lèi)或其他程序包的類(lèi)有很好的區(qū)分度,所以一般導(dǎo)入具體的類(lèi),然后在程序里直接使用這個(gè)類(lèi)。
盡量不要使用類(lèi)似于這樣的導(dǎo)入語(yǔ)句:
?
-
from PyQt5.QtWidgets import *
這樣雖然可以導(dǎo)入PyQt5.QtWidgets中的所有類(lèi)并且直接使用,但是會(huì)導(dǎo)入很多不需要用到的類(lèi),這可能使程序運(yùn)行變慢。
對(duì)于一個(gè)具體的類(lèi),如何知道它屬于哪個(gè)模塊呢?例如,對(duì)于類(lèi)QPalette,如何知道它屬于哪個(gè)模塊,從而使用正確的import語(yǔ)句呢?
Qt C++的類(lèi)庫(kù)也是以模塊組織的,Qt C++類(lèi)庫(kù)中的模塊與PyQt5中的模塊基本是對(duì)應(yīng)的,可以在Qt Creator的幫助頁(yè)面查找一個(gè)類(lèi)的詳細(xì)資料來(lái)查到其屬于哪個(gè)模塊。例如,QPalette類(lèi)的幫助信息的基本描述如圖2-33所示,其中有一行是:
?
-
qmake: QT += gui
這表明在Qt C++類(lèi)庫(kù)中,QPalette是屬于gui模塊的,那么在PyQt5中對(duì)應(yīng)的模塊就是PyQt5.QtGui,所以導(dǎo)入語(yǔ)句應(yīng)該是:
?
-
from PyQt5.QtGui import QPalette
Qt幫助文檔中qmake語(yǔ)句常見(jiàn)的描述與PyQt5模塊的對(duì)應(yīng)關(guān)系如表2-6所示。
表2-6 Qt幫助文檔里的qmake描述與PyQt5模塊的對(duì)應(yīng)關(guān)系
Qt幫助中qmake描述 | 對(duì)應(yīng)的PyQt5模塊 | 示例導(dǎo)入語(yǔ)句 |
---|---|---|
QT += core | QtCore | from PyQt5.QtCore import QDateTime from PyQt5.QtCore import Qt |
QT += gui | QtGui | from PyQt5.QtGui import QIcon |
QT += widgets | QtWidgets | from PyQt5.QtWidgets import QFileDialog |
QT += multimedia | QtMultimedia | from PyQt5.QtMultimedia import QAudioInput |
QT += multimediawidgets | QtMultimediaWidgets | from PyQt5.QtMultimediaWidgets import QVideoWidget |
QT += sql | QtSql | from PyQt5.QtSql import QSqlQuery |
2.6.3 部分類(lèi)和接口函數(shù)的差異
PyQt5中大部分類(lèi)的接口函數(shù),以及每個(gè)函數(shù)的輸入輸出參數(shù)定義與Qt C++類(lèi)庫(kù)中的是一致的,所以在Qt Creator中查詢(xún)幫助信息就可以知道類(lèi)的接口或一個(gè)函數(shù)的輸入輸出參數(shù)。
但是有少量PyQt5的類(lèi)或接口函數(shù)與Qt C++類(lèi)庫(kù)中的是不一樣的。例如,對(duì)于QDataStream類(lèi),Qt C++類(lèi)庫(kù)中使用流操作符“>>”和“<<”實(shí)現(xiàn)各種類(lèi)型數(shù)據(jù)的輸入和輸出,但是PyQt5中的QDataStream類(lèi)沒(méi)有這兩個(gè)流操作符,而是定義了很多接口函數(shù)進(jìn)行各種數(shù)據(jù)的輸入和輸出(詳見(jiàn)9.3節(jié))。
另外,有少量函數(shù)的接口在PyQt5和Qt C++中的定義不一樣。例如,QFileDialog類(lèi)的getOpenFileName()在Qt C++中的函數(shù)原型(省略了輸入?yún)?shù))是:
?
-
QString getOpenFileName(…);
而用help()指令查看的PyQt5中的函數(shù)原型(省略了輸入?yún)?shù))是:
?
-
getOpenFileName(…) -> Tuple[str, str]
getOpenFileName()函數(shù)在Qt C++和PyQt5中的輸入?yún)?shù)相同,所以上面都省略了輸入?yún)?shù)的顯示。但是在Qt C++中,getOpenFileName()函數(shù)只返回一個(gè)選擇的文件名,而在PyQt5中,getOpenFileName()返回一個(gè)Tuple類(lèi)型的數(shù)據(jù),第一個(gè)str類(lèi)型數(shù)據(jù)是選擇的文件名,第二個(gè)str類(lèi)型數(shù)據(jù)是使用的文件過(guò)濾器。如果直接按照Qt C++中的函數(shù)原型在Python中使用QFileDialog.getOpenFileName()函數(shù)就會(huì)出現(xiàn)問(wèn)題。
在Qt C++類(lèi)庫(kù)和PyQt5之間存在差異的類(lèi)和接口函數(shù)并不多,但如果不知道這些差異,按照Qt C++類(lèi)庫(kù)的接口定義來(lái)使用PyQt5中的相應(yīng)類(lèi)或函數(shù)就會(huì)出現(xiàn)問(wèn)題。例如,只根據(jù)Qt幫助文檔里的函數(shù)原型使用PyQt5中的類(lèi)或函數(shù),或者是熟悉Qt C++類(lèi)庫(kù)使用的讀者根據(jù)經(jīng)驗(yàn)使用這些有差異的類(lèi)或函數(shù)。
下面是整理的本書(shū)示例程序或使用PyQt5過(guò)程中遇到過(guò)的有差異的類(lèi)或函數(shù),這不是覆蓋整個(gè)PyQt5的清單,不全面,但是可以讓讀者遇到此類(lèi)問(wèn)題時(shí)避免落入陷阱耗費(fèi)時(shí)間。下面整理的內(nèi)容只是列出了這些有差異的類(lèi)或函數(shù),并做簡(jiǎn)單說(shuō)明,至于具體的差異之處,書(shū)中示例程序中涉及的地方會(huì)有具體說(shuō)明。讀者在用到以下這些類(lèi)或函數(shù)時(shí),也可以查閱Qt C++幫助文檔和PyQt5內(nèi)置幫助信息來(lái)明確這些差異之處。
(1)QDataStream類(lèi):接口函數(shù)存在較大差異,Qt C++中使用流操作符“>>”和“<<”,PyQt5中使用大量的接口函數(shù)替代流操作符。
(2)QFileDialog類(lèi):三個(gè)類(lèi)函數(shù)getOpenFileName()、getOpenFileNames()、getSaveFileName()的返回?cái)?shù)據(jù)有差異。Qt C++中只返回文件名或文件名列表,而PyQt5中返回的是一個(gè)Tuple類(lèi)型的數(shù)據(jù),第一個(gè)元素是文件名或文件名列表,第二個(gè)元素是使用的文件名過(guò)濾器。
(3)QFontDialog類(lèi):類(lèi)函數(shù)getFont()的輸入?yún)?shù)、返回?cái)?shù)據(jù)有差異。
(4)QInputDialog類(lèi):getText()、getInt()等類(lèi)函數(shù)返回?cái)?shù)據(jù)有差異。
(5)QMediaRecorder類(lèi):supportedAudioSampleRates()函數(shù)返回?cái)?shù)據(jù)有差異。
2.6.4 數(shù)據(jù)類(lèi)型對(duì)應(yīng)關(guān)系
C++是強(qiáng)制類(lèi)型定義的語(yǔ)言,Python是動(dòng)態(tài)數(shù)據(jù)類(lèi)型語(yǔ)言,而且兩種語(yǔ)言之間的數(shù)據(jù)類(lèi)型有一些差異。例如對(duì)于字符串?dāng)?shù)據(jù),Python有內(nèi)建的str類(lèi)型,而Qt C++中使用QString類(lèi)。
Qt C++類(lèi)庫(kù)轉(zhuǎn)換為PyQt5后,某些Qt C++中的數(shù)據(jù)類(lèi)型與Python中的數(shù)據(jù)類(lèi)型存在對(duì)應(yīng)關(guān)系,知道這些常見(jiàn)的對(duì)應(yīng)關(guān)系后,就可以根據(jù)Qt Creator里查到的Qt C++函數(shù)原型迅速知道Python中的函數(shù)原型,從而正確使用這些函數(shù)。
1.枚舉型常數(shù)
Qt C++的名稱(chēng)空間(namespace)Qt包含大量的枚舉類(lèi)型的定義,例如,表示預(yù)定義顏色的枚舉類(lèi)型:
?
-
enum Qt::GlobalColor
其部分枚舉值有Qt::white、Qt::black、Qt::red、Qt::blue等。
PyQt5.QtCore模塊中的類(lèi)Qt對(duì)應(yīng)于Qt C++類(lèi)庫(kù)中的名稱(chēng)空間Qt,這些枚舉類(lèi)型常量都通過(guò)類(lèi)屬性訪問(wèn),例如預(yù)定義顏色常量Qt.white、Qt.red等。
在Qt C++中,也經(jīng)常在類(lèi)里定義枚舉類(lèi)型,例如QPalette類(lèi)定義的用于表示顏色角色的枚舉類(lèi)型:
?
-
enum QPalette::ColorRole
其部分枚舉值有QPalette::Window、QPalette::Text等。
在PyQt5中,對(duì)應(yīng)的枚舉類(lèi)型就是QPalette.ColorRole,而這些枚舉類(lèi)型常量作為類(lèi)屬性訪問(wèn),也就是QPalette.Window、QPalette.Text等。
2.Qt C++中的QString與Python的str類(lèi)型
PyQt5中沒(méi)有QString類(lèi)型,Qt C++中的QString會(huì)被自動(dòng)轉(zhuǎn)換為Python的str類(lèi)型,例如,C++中的一個(gè)函數(shù)返回值是QString類(lèi)型:
?
-
QString QFileDialog::getExistingDirectory(…);
在PyQt5中的返回值就是str類(lèi)型:
?
-
getExistingDirectory(…) -> str
由于返回結(jié)果是Python的str類(lèi)型,不能使用QString的接口函數(shù)對(duì)返回結(jié)果進(jìn)行處理,而應(yīng)該使用Python的str類(lèi)型的接口函數(shù)。
3.列表類(lèi)型
在Qt C++中用QList
例如,Qt C++中QFileDialog.getOpenFileNames()函數(shù)用于返回選擇的多個(gè)文件的列表,其C++函數(shù)原型定義(省略了輸入?yún)?shù))是:
?
-
QStringList getOpenFileNames(…);
而在PyQt5的內(nèi)置幫助信息顯示的函數(shù)原型(省略了輸入?yún)?shù))是:
?
-
getOpenFileNames(…) -> Tuple[List[str], str]
其返回?cái)?shù)據(jù)是Tuple類(lèi)型,第一個(gè)數(shù)據(jù)List[str]是選擇的文件名稱(chēng)字符串列表,第二個(gè)str數(shù)據(jù)是使用的文件過(guò)濾器。所以,這里還存在Qt C++與PyQt5函數(shù)參數(shù)不一致的問(wèn)題。
既然返回的結(jié)果是list[str],就應(yīng)該用Python的list數(shù)據(jù)處理的方法,例如:
?
-
fileList,flt=QFileDialog.getOpenFileNames(self,"選擇多個(gè)文件",
-
"", "Images(*.jpg)")
-
if (len(fileList)<1): #fileList是字符串列表
-
return
-
for i in range(len(fileList)):
-
print(fileList[i])
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
