上周給大家推薦了新書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 幫助信息的查找
1.在Qt Creator中查找幫助信息
安裝PyQt5時不會安裝完整的類庫幫助文檔,PyQt5的在線Reference Guide提供了PyQt5使用中的一些關鍵技術問題的說明,但是關于具體的某個類的信息并不完整,不如Qt官網上的幫助文檔信息全面。
要離線獲取一個類的詳細幫助信息,可以使用Qt Creator的幫助窗口。例如,在Qt Creator的幫助窗口里搜索QSpinBox,其資料頁面如圖2-32所示,這里有對QSpinBox類的簡單說明和主要特性的示例代碼,列出了其所有的屬性、類型定義、公共接口函數、公共槽函數、信號等,并且可以查看每一項的詳細資料。
圖2-32 在Qt Creator的幫助窗口查找類的詳細信息
Qt類庫包含的類很多,具體到某個特定的類,其屬性、接口函數、信號也很多,不可能全部介紹或列出來。對任何一種編程語言來說,其自帶的幫助文檔的信息都是最全面最準確的,學習時要善于查找幫助信息。
2.在Python中查找幫助信息
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 正確導入模塊中的類
1.PyQt5的常用模塊
PyQt5是Qt C++類庫的一個Python綁定,它包含了很多模塊,在PyQt5安裝后的目錄“D:\Python37\Lib\site-packages\PyQt5”里可以看到所有模塊的文件。在前面的示例程序中已經用到了QtWidgets、QtCore、QtGui等模塊,PyQt5中常用的幾個模塊如表2-5所示。
表2-5 PyQt5中常用的模塊
PyQt5模塊名 | 主要功能 | 包含的類示例 |
---|---|---|
QtCore | 提供核心的非GUI功能的類,包括常用的名稱空間Qt | QFile、QDir、QTimer等Qt中的非界面組件類 包含各種枚舉類型的名稱空間Qt pyqtSlot、pyQtSignal等在PyQt5中引入的函數 |
QtGui | 提供GUI設計中用于窗口系統集成、事件處理、繪圖等功能的類 | QIcon、QFont、QPixMap、QCloseEvent、QPalette、QPainter等GUI底層實現類 |
QtWidgets | 提供GUI設計中所有窗體顯示的類,包括各種窗體、標準對話框、按鈕、文本框等組件 | QMainWindow、QWidget、QDialog等窗體 QColorDialog、QFileDialog等標準對話框 QRadioButton、QSpinBox、QMenu等界面組件 |
QtMultimedia | 提供音頻、視頻、攝像頭操作的類 | QCamera、QAudioInput、QMedaiPlayer等 |
QtMultimediaWidgets | 提供多媒體窗體顯示的類 | QCameraViewfinder、QVideoWidget等 |
QtSql | 提供SQL數據庫驅動、數據查詢和操作的類 | QSqlDatabase、QSqlQuery、QSqlRecord等 |
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類的幫助信息的基本描述如圖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模塊的對應關系
Qt幫助中qmake描述 | 對應的PyQt5模塊 | 示例導入語句 |
---|---|---|
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 部分類和接口函數的差異
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中的函數原型,從而正確使用這些函數。
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
例如,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])
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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