你等待的Python Qt GUI來啦!順帶送你點干貨:從Qt C++類庫到PyQt5
上周給大家推薦了新書Python Qt GUI與數據可視化編程,受到了廣大讀者的青睞,很多人問我何時上架?什么時間預訂?能不能給發完整目錄?需要這種知識很久了等回應。今天可以告訴大家,這本書上架啦!!!!
本書介紹在Python中使用PyQt5和其他模塊進行GUI和數據可視化編程的方法。第一部分介紹PyQt5設計GUI程序的基本框架,包括GUI應用程序的基本結構、窗體UI可視化設計與窗體業務邏輯的設計、信號與槽的特點和使用等。第二部分介紹GUI程序設計中一些主要功能模塊的使用,包括基本界面組件、事件處理、數據庫、繪圖、多媒體等。第三部分先介紹使用PyQtChart和PyQtDataVisualization進行二維和三維數據可視化設計的方法,再介紹將Matplotlib嵌入PyQt5 GUI應用程序窗口界面中進行數據可視化的編程方法。通過研讀本書,讀者可以掌握使用PyQt5、PyQtChart、Matplotlib等模塊進行GUI應用程序和數據可視化設計的方法。
本書適合具有Python編程基礎,并想通過Python設計GUI應用程序或在GUI應用程序中實現數據可視化的讀者閱讀和參考。
干貨截選:2.6 從Qt C++類庫到PyQt5
2.6.1 幫助信息的查找
安裝PyQt5時不會安裝完整的類庫幫助文檔,PyQt5的在線Reference Guide提供了PyQt5使用中的一些關鍵技術問題的說明,但是關于具體的某個類的信息并不完整,不如Qt官網上的幫助文檔信息全面。
要離線獲取一個類的詳細幫助信息,可以使用Qt Creator的幫助窗口。例如,在Qt Creator的幫助窗口里搜索QSpinBox,其資料頁面如圖2-32所示,這里有對QSpinBox類的簡單說明和主要特性的示例代碼,列出了其所有的屬性、類型定義、公共接口函數、公共槽函數、信號等,并且可以查看每一項的詳細資料。
圖2-32 在Qt Creator的幫助窗口查找類的詳細信息
Qt類庫包含的類很多,具體到某個特定的類,其屬性、接口函數、信號也很多,不可能全部介紹或列出來。對任何一種編程語言來說,其自帶的幫助文檔的信息都是最全面最準確的,學習時要善于查找幫助信息。
PyQt5安裝后雖然沒有Qt Creator里那樣詳細的類庫幫助文檔,但是可以通過Python的一些基本指令獲取類或函數的內置幫助信息。例如,dir()指令可以顯示一個類的所有接口信息;help()指令可以顯示一個類的詳細接口定義或一個函數的原型定義。
例如,要在Python Shell里查看QSpinBox的幫助信息,可執行下面的指令:
>>>?from?PyQt5.QtWidgets?import?QSpinBox >>>?dir(QSpinBox)
指令dir(QSpinBox)會列出QSpinBox的所有屬性和方法的名稱,包括所有從父類繼承的屬性和方法。
>>>?help(QSpinBox)
指令help(QSpinBox)會更詳細地列出QSpinBox類的所有屬性和方法,它會先列出QSpinBox類里新定義的屬性和方法,然后依次列出父類的屬性和方法。接口函數(即方法)會顯示輸入輸出參數定義。
help()指令也可以顯示一個方法的函數原型(如QSpinBox.setValue()函數)的幫助信息:
>>>?help(QSpinBox.setValue)Help?on?built-in?function?setValue:setValue(...)????setValue(self,?int)
其中的最后一行表示setValue()函數需要一個int類型的輸入參數,沒有返回值。self是Python中所有類的接口函數的第一個參數,不看作函數參數。
>>>?help?(QSpinBox.value) Help?on?built-in?function?value: value(...) ????value(self)?->?int
上面顯示的是QSpinBox.value()函數的幫助信息,最后一行表示value()函數返回一個int類型的數據,沒有輸入參數。
PyQt5的內置幫助信息雖然不詳細、查閱不方便,但是可以提供最準確的信息,特別是在函數的輸入輸出參數定義上。對于某些類或函數,Qt C++類庫中的定義和PyQt5中的定義有差異,應該以PyQt5的定義為準。
2.6.2 正確導入模塊中的類
PyQt5是Qt C++類庫的一個Python綁定,它包含了很多模塊,在PyQt5安裝后的目錄“D:\Python37\Lib\site-packages\PyQt5”里可以看到所有模塊的文件。在前面的示例程序中已經用到了QtWidgets、QtCore、QtGui等模塊,PyQt5中常用的幾個模塊如表2-5所示。
表2-5 PyQt5中常用的模塊
在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類的幫助信息的基本描述如圖2-33所示,其中有一行是:
qmake:??QT?+=?gui
這表明在Qt C++類庫中,QPalette是屬于gui模塊的,那么在PyQt5中對應的模塊就是PyQt5.QtGui,所以導入語句應該是:
from?PyQt5.QtGui?import??QPalette
Qt幫助文檔中qmake語句常見的描述與PyQt5模塊的對應關系如表2-6所示。
表2-6 Qt幫助文檔里的qmake描述與PyQt5模塊的對應關系
2.6.3 部分類和接口函數的差異
PyQt5中大部分類的接口函數,以及每個函數的輸入輸出參數定義與Qt C++類庫中的是一致的,所以在Qt Creator中查詢幫助信息就可以知道類的接口或一個函數的輸入輸出參數。
但是有少量PyQt5的類或接口函數與Qt C++類庫中的是不一樣的。例如,對于QDataStream類,Qt C++類庫中使用流操作符“>>”和“<<”實現各種類型數據的輸入和輸出,但是PyQt5中的QDataStream類沒有這兩個流操作符,而是定義了很多接口函數進行各種數據的輸入和輸出(詳見9.3節)。
另外,有少量函數的接口在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()函數返回數據有差異。
2.6.4 數據類型對應關系
C++是強制類型定義的語言,Python是動態數據類型語言,而且兩種語言之間的數據類型有一些差異。例如對于字符串數據,Python有內建的str類型,而Qt C++中使用QString類。
Qt C++類庫轉換為PyQt5后,某些Qt C++中的數據類型與Python中的數據類型存在對應關系,知道這些常見的對應關系后,就可以根據Qt Creator里查到的Qt C++函數原型迅速知道Python中的函數原型,從而正確使用這些函數。
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等。
PyQt5中沒有QString類型,Qt C++中的QString會被自動轉換為Python的str類型,例如,C++中的一個函數返回值是QString類型:
QString?QFileDialog::getExistingDirectory(…);
在PyQt5中的返回值就是str類型:
getExistingDirectory(…)?->?str
由于返回結果是Python的str類型,不能使用QString的接口函數對返回結果進行處理,而應該使用Python的str類型的接口函數。
在Qt C++中用QList
例如,Qt C++中QFileDialog.getOpenFileNames()函數用于返回選擇的多個文件的列表,其C++函數原型定義(省略了輸入參數)是:
QStringList??getOpenFileNames(…);
而在PyQt5的內置幫助信息顯示的函數原型(省略了輸入參數)是:
getOpenFileNames(…)?->?Tuple[List[str],?str]
其返回數據是Tuple類型,第一個數據List[str]是選擇的文件名稱字符串列表,第二個str數據是使用的文件過濾器。所以,這里還存在Qt C++與PyQt5函數參數不一致的問題。
既然返回的結果是list[str],就應該用Python的list數據處理的方法,例如:
本文轉載自異步社區。
Qt GUI C++ Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。