日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

你等待的Python Qt GUI來啦!順帶送干貨:從Qt C++類庫到

系統(tǒng) 1774 0

上周給大家推薦了新書Python Qt GUI與數(shù)據(jù)可視化編程,受到了廣大讀者的青睞,很多人問我何時(shí)上架?什么時(shí)間預(yù)訂?能不能給發(fā)完整目錄?需要這種知識(shí)很久了等回應(yīng)。今天可以告訴大家,這本書上架啦!!!!

你等待的Python Qt GUI來啦!順帶送干貨:從Qt C++類庫到PyQt5_第1張圖片

【京東購買】【當(dāng)當(dāng)購買】

本書介紹在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ù)庫、繪圖、多媒體等。第三部分先介紹使用PyQtChart和PyQtDataVisualization進(jìn)行二維和三維數(shù)據(jù)可視化設(shè)計(jì)的方法,再介紹將Matplotlib嵌入PyQt5 GUI應(yīng)用程序窗口界面中進(jìn)行數(shù)據(jù)可視化的編程方法。通過研讀本書,讀者可以掌握使用PyQt5、PyQtChart、Matplotlib等模塊進(jìn)行GUI應(yīng)用程序和數(shù)據(jù)可視化設(shè)計(jì)的方法。

本書適合具有Python編程基礎(chǔ),并想通過Python設(shè)計(jì)GUI應(yīng)用程序或在GUI應(yīng)用程序中實(shí)現(xiàn)數(shù)據(jù)可視化的讀者閱讀和參考。

干貨截選:2.6 從Qt C++類庫到PyQt5

2.6.1 幫助信息的查找

1.在Qt Creator中查找?guī)椭畔?

安裝PyQt5時(shí)不會(huì)安裝完整的類庫幫助文檔,PyQt5的在線Reference Guide提供了PyQt5使用中的一些關(guān)鍵技術(shù)問題的說明,但是關(guān)于具體的某個(gè)類的信息并不完整,不如Qt官網(wǎng)上的幫助文檔信息全面。

要離線獲取一個(gè)類的詳細(xì)幫助信息,可以使用Qt Creator的幫助窗口。例如,在Qt Creator的幫助窗口里搜索QSpinBox,其資料頁面如圖2-32所示,這里有對(duì)QSpinBox類的簡(jiǎn)單說明和主要特性的示例代碼,列出了其所有的屬性、類型定義、公共接口函數(shù)、公共槽函數(shù)、信號(hào)等,并且可以查看每一項(xiàng)的詳細(xì)資料。

你等待的Python Qt GUI來啦!順帶送干貨:從Qt C++類庫到PyQt5_第2張圖片

圖2-32 在Qt Creator的幫助窗口查找類的詳細(xì)信息

Qt類庫包含的類很多,具體到某個(gè)特定的類,其屬性、接口函數(shù)、信號(hào)也很多,不可能全部介紹或列出來。對(duì)任何一種編程語言來說,其自帶的幫助文檔的信息都是最全面最準(zhǔn)確的,學(xué)習(xí)時(shí)要善于查找?guī)椭畔ⅰ?

2.在Python中查找?guī)椭畔?

PyQt5安裝后雖然沒有Qt Creator里那樣詳細(xì)的類庫幫助文檔,但是可以通過Python的一些基本指令獲取類或函數(shù)的內(nèi)置幫助信息。例如,dir()指令可以顯示一個(gè)類的所有接口信息;help()指令可以顯示一個(gè)類的詳細(xì)接口定義或一個(gè)函數(shù)的原型定義。

例如,要在Python Shell里查看QSpinBox的幫助信息,可執(zhí)行下面的指令:

            ?
          
  1. >>> from PyQt5.QtWidgets import QSpinBox
  2. >>> dir(QSpinBox)

指令dir(QSpinBox)會(huì)列出QSpinBox的所有屬性和方法的名稱,包括所有從父類繼承的屬性和方法。

            ?
          
  1. >>> help(QSpinBox)

指令help(QSpinBox)會(huì)更詳細(xì)地列出QSpinBox類的所有屬性和方法,它會(huì)先列出QSpinBox類里新定義的屬性和方法,然后依次列出父類的屬性和方法。接口函數(shù)(即方法)會(huì)顯示輸入輸出參數(shù)定義。

help()指令也可以顯示一個(gè)方法的函數(shù)原型(如QSpinBox.setValue()函數(shù))的幫助信息:

            ?
          
  1. >>> help(QSpinBox.setValue)
  2. Help on built-in function setValue:
  3. setValue(...)
  4. setValue(self, int)

其中的最后一行表示setValue()函數(shù)需要一個(gè)int類型的輸入?yún)?shù),沒有返回值。self是Python中所有類的接口函數(shù)的第一個(gè)參數(shù),不看作函數(shù)參數(shù)。

            ?
          
  1. >>> help (QSpinBox.value)
  2. Help on built-in function value:
  3. value(...)
  4. value(self) -> int

上面顯示的是QSpinBox.value()函數(shù)的幫助信息,最后一行表示value()函數(shù)返回一個(gè)int類型的數(shù)據(jù),沒有輸入?yún)?shù)。

PyQt5的內(nèi)置幫助信息雖然不詳細(xì)、查閱不方便,但是可以提供最準(zhǔn)確的信息,特別是在函數(shù)的輸入輸出參數(shù)定義上。對(duì)于某些類或函數(shù),Qt C++類庫中的定義和PyQt5中的定義有差異,應(yīng)該以PyQt5的定義為準(zhǔn)。

2.6.2 正確導(dǎo)入模塊中的類

1.PyQt5的常用模塊

PyQt5是Qt C++類庫的一個(gè)Python綁定,它包含了很多模塊,在PyQt5安裝后的目錄“D:\Python37\Lib\site-packages\PyQt5”里可以看到所有模塊的文件。在前面的示例程序中已經(jīng)用到了QtWidgets、QtCore、QtGui等模塊,PyQt5中常用的幾個(gè)模塊如表2-5所示。

表2-5 PyQt5中常用的模塊

PyQt5模塊名 主要功能 包含的類示例
QtCore 提供核心的非GUI功能的類,包括常用的名稱空間Qt QFile、QDir、QTimer等Qt中的非界面組件類 包含各種枚舉類型的名稱空間Qt pyqtSlot、pyQtSignal等在PyQt5中引入的函數(shù)
QtGui 提供GUI設(shè)計(jì)中用于窗口系統(tǒng)集成、事件處理、繪圖等功能的類 QIcon、QFont、QPixMap、QCloseEvent、QPalette、QPainter等GUI底層實(shí)現(xiàn)類
QtWidgets 提供GUI設(shè)計(jì)中所有窗體顯示的類,包括各種窗體、標(biāo)準(zhǔn)對(duì)話框、按鈕、文本框等組件 QMainWindow、QWidget、QDialog等窗體 QColorDialog、QFileDialog等標(biāo)準(zhǔn)對(duì)話框 QRadioButton、QSpinBox、QMenu等界面組件
QtMultimedia 提供音頻、視頻、攝像頭操作的類 QCamera、QAudioInput、QMedaiPlayer等
QtMultimediaWidgets 提供多媒體窗體顯示的類 QCameraViewfinder、QVideoWidget等
QtSql 提供SQL數(shù)據(jù)庫驅(qū)動(dòng)、數(shù)據(jù)查詢和操作的類 QSqlDatabase、QSqlQuery、QSqlRecord等

2.查找類所在的模塊

在Python程序里用到某個(gè)PyQt5的類時(shí),需要用import語句導(dǎo)入這個(gè)類,例如在前面的示例程序中用過這樣的導(dǎo)入語句:

            ?
          
  1. from PyQt5.QtWidgets import QApplication, QWidget
  2. from PyQt5.QtCore import pyqtSlot, pyqtSignal
  3. from PyQt5.QtGui import QIcon

因?yàn)镼t的類一般都以大寫字母Q開頭作為類名,與Python自帶的類或其他程序包的類有很好的區(qū)分度,所以一般導(dǎo)入具體的類,然后在程序里直接使用這個(gè)類。

盡量不要使用類似于這樣的導(dǎo)入語句:

            ?
          
  1. from PyQt5.QtWidgets import *

這樣雖然可以導(dǎo)入PyQt5.QtWidgets中的所有類并且直接使用,但是會(huì)導(dǎo)入很多不需要用到的類,這可能使程序運(yùn)行變慢。

對(duì)于一個(gè)具體的類,如何知道它屬于哪個(gè)模塊呢?例如,對(duì)于類QPalette,如何知道它屬于哪個(gè)模塊,從而使用正確的import語句呢?

Qt C++的類庫也是以模塊組織的,Qt C++類庫中的模塊與PyQt5中的模塊基本是對(duì)應(yīng)的,可以在Qt Creator的幫助頁面查找一個(gè)類的詳細(xì)資料來查到其屬于哪個(gè)模塊。例如,QPalette類的幫助信息的基本描述如圖2-33所示,其中有一行是:

            ?
          
  1. qmake: QT += gui

這表明在Qt C++類庫中,QPalette是屬于gui模塊的,那么在PyQt5中對(duì)應(yīng)的模塊就是PyQt5.QtGui,所以導(dǎo)入語句應(yīng)該是:

            ?
          
  1. from PyQt5.QtGui import QPalette

Qt幫助文檔中qmake語句常見的描述與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)入語句
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 部分類和接口函數(shù)的差異

PyQt5中大部分類的接口函數(shù),以及每個(gè)函數(shù)的輸入輸出參數(shù)定義與Qt C++類庫中的是一致的,所以在Qt Creator中查詢幫助信息就可以知道類的接口或一個(gè)函數(shù)的輸入輸出參數(shù)。

但是有少量PyQt5的類或接口函數(shù)與Qt C++類庫中的是不一樣的。例如,對(duì)于QDataStream類,Qt C++類庫中使用流操作符“>>”和“<<”實(shí)現(xiàn)各種類型數(shù)據(jù)的輸入和輸出,但是PyQt5中的QDataStream類沒有這兩個(gè)流操作符,而是定義了很多接口函數(shù)進(jìn)行各種數(shù)據(jù)的輸入和輸出(詳見9.3節(jié))。

另外,有少量函數(shù)的接口在PyQt5和Qt C++中的定義不一樣。例如,QFileDialog類的getOpenFileName()在Qt C++中的函數(shù)原型(省略了輸入?yún)?shù))是:

            ?
          
  1. QString getOpenFileName(…);

而用help()指令查看的PyQt5中的函數(shù)原型(省略了輸入?yún)?shù))是:

            ?
          
  1. getOpenFileName(…) -> Tuple[str, str]

getOpenFileName()函數(shù)在Qt C++和PyQt5中的輸入?yún)?shù)相同,所以上面都省略了輸入?yún)?shù)的顯示。但是在Qt C++中,getOpenFileName()函數(shù)只返回一個(gè)選擇的文件名,而在PyQt5中,getOpenFileName()返回一個(gè)Tuple類型的數(shù)據(jù),第一個(gè)str類型數(shù)據(jù)是選擇的文件名,第二個(gè)str類型數(shù)據(jù)是使用的文件過濾器。如果直接按照Qt C++中的函數(shù)原型在Python中使用QFileDialog.getOpenFileName()函數(shù)就會(huì)出現(xiàn)問題。

在Qt C++類庫和PyQt5之間存在差異的類和接口函數(shù)并不多,但如果不知道這些差異,按照Qt C++類庫的接口定義來使用PyQt5中的相應(yīng)類或函數(shù)就會(huì)出現(xiàn)問題。例如,只根據(jù)Qt幫助文檔里的函數(shù)原型使用PyQt5中的類或函數(shù),或者是熟悉Qt C++類庫使用的讀者根據(jù)經(jīng)驗(yàn)使用這些有差異的類或函數(shù)。

下面是整理的本書示例程序或使用PyQt5過程中遇到過的有差異的類或函數(shù),這不是覆蓋整個(gè)PyQt5的清單,不全面,但是可以讓讀者遇到此類問題時(shí)避免落入陷阱耗費(fèi)時(shí)間。下面整理的內(nèi)容只是列出了這些有差異的類或函數(shù),并做簡(jiǎn)單說明,至于具體的差異之處,書中示例程序中涉及的地方會(huì)有具體說明。讀者在用到以下這些類或函數(shù)時(shí),也可以查閱Qt C++幫助文檔和PyQt5內(nèi)置幫助信息來明確這些差異之處。

(1)QDataStream類:接口函數(shù)存在較大差異,Qt C++中使用流操作符“>>”和“<<”,PyQt5中使用大量的接口函數(shù)替代流操作符。

(2)QFileDialog類:三個(gè)類函數(shù)getOpenFileName()、getOpenFileNames()、getSaveFileName()的返回?cái)?shù)據(jù)有差異。Qt C++中只返回文件名或文件名列表,而PyQt5中返回的是一個(gè)Tuple類型的數(shù)據(jù),第一個(gè)元素是文件名或文件名列表,第二個(gè)元素是使用的文件名過濾器。

(3)QFontDialog類:類函數(shù)getFont()的輸入?yún)?shù)、返回?cái)?shù)據(jù)有差異。

(4)QInputDialog類:getText()、getInt()等類函數(shù)返回?cái)?shù)據(jù)有差異。

(5)QMediaRecorder類:supportedAudioSampleRates()函數(shù)返回?cái)?shù)據(jù)有差異。

2.6.4 數(shù)據(jù)類型對(duì)應(yīng)關(guān)系

C++是強(qiáng)制類型定義的語言,Python是動(dòng)態(tài)數(shù)據(jù)類型語言,而且兩種語言之間的數(shù)據(jù)類型有一些差異。例如對(duì)于字符串?dāng)?shù)據(jù),Python有內(nèi)建的str類型,而Qt C++中使用QString類。

Qt C++類庫轉(zhuǎn)換為PyQt5后,某些Qt C++中的數(shù)據(jù)類型與Python中的數(shù)據(jù)類型存在對(duì)應(yīng)關(guān)系,知道這些常見的對(duì)應(yīng)關(guān)系后,就可以根據(jù)Qt Creator里查到的Qt C++函數(shù)原型迅速知道Python中的函數(shù)原型,從而正確使用這些函數(shù)。

1.枚舉型常數(shù)

Qt C++的名稱空間(namespace)Qt包含大量的枚舉類型的定義,例如,表示預(yù)定義顏色的枚舉類型:

            ?
          
  1. enum Qt::GlobalColor

其部分枚舉值有Qt::white、Qt::black、Qt::red、Qt::blue等。

PyQt5.QtCore模塊中的類Qt對(duì)應(yīng)于Qt C++類庫中的名稱空間Qt,這些枚舉類型常量都通過類屬性訪問,例如預(yù)定義顏色常量Qt.white、Qt.red等。

在Qt C++中,也經(jīng)常在類里定義枚舉類型,例如QPalette類定義的用于表示顏色角色的枚舉類型:

            ?
          
  1. enum QPalette::ColorRole

其部分枚舉值有QPalette::Window、QPalette::Text等。

在PyQt5中,對(duì)應(yīng)的枚舉類型就是QPalette.ColorRole,而這些枚舉類型常量作為類屬性訪問,也就是QPalette.Window、QPalette.Text等。

2.Qt C++中的QString與Python的str類型

PyQt5中沒有QString類型,Qt C++中的QString會(huì)被自動(dòng)轉(zhuǎn)換為Python的str類型,例如,C++中的一個(gè)函數(shù)返回值是QString類型:

            ?
          
  1. QString QFileDialog::getExistingDirectory(…);

在PyQt5中的返回值就是str類型:

            ?
          
  1. getExistingDirectory(…) -> str

由于返回結(jié)果是Python的str類型,不能使用QString的接口函數(shù)對(duì)返回結(jié)果進(jìn)行處理,而應(yīng)該使用Python的str類型的接口函數(shù)。

3.列表類型

在Qt C++中用QList 定義類型為type的數(shù)據(jù)列表,而在Python中有內(nèi)建的list數(shù)據(jù)類型,所以,Qt C++中的QList 在PyQt5中對(duì)應(yīng)的是list[type]數(shù)據(jù)。例如,Qt C++中用于表示字符串列表的是QStringList類,在PyQt5中沒有這個(gè)類,而是轉(zhuǎn)換為list[str]數(shù)據(jù)。

例如,Qt C++中QFileDialog.getOpenFileNames()函數(shù)用于返回選擇的多個(gè)文件的列表,其C++函數(shù)原型定義(省略了輸入?yún)?shù))是:

            ?
          
  1. QStringList getOpenFileNames(…);

而在PyQt5的內(nèi)置幫助信息顯示的函數(shù)原型(省略了輸入?yún)?shù))是:

            ?
          
  1. getOpenFileNames(…) -> Tuple[List[str], str]

其返回?cái)?shù)據(jù)是Tuple類型,第一個(gè)數(shù)據(jù)List[str]是選擇的文件名稱字符串列表,第二個(gè)str數(shù)據(jù)是使用的文件過濾器。所以,這里還存在Qt C++與PyQt5函數(shù)參數(shù)不一致的問題。

既然返回的結(jié)果是list[str],就應(yīng)該用Python的list數(shù)據(jù)處理的方法,例如:

            ?
          
  1. fileList,flt=QFileDialog.getOpenFileNames(self,"選擇多個(gè)文件",
  2. "", "Images(*.jpg)")
  3. if (len(fileList)<1): #fileList是字符串列表
  4. return
  5. for i in range(len(fileList)):
  6. print(fileList[i])

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 嘉鱼县| 灌云县| 拜城县| 枝江市| 辽宁省| 花莲市| 陆良县| 胶州市| 红安县| 合阳县| 安新县| 亚东县| 平邑县| 寿阳县| 岑巩县| 海盐县| 延长县| 山西省| 新龙县| 稷山县| 洞头县| 东方市| 大埔区| 怀宁县| 郴州市| 邻水| 邢台市| 顺昌县| 婺源县| 平舆县| 宝丰县| 惠东县| 新乡市| 长乐市| 云浮市| 永登县| 浦江县| 隆德县| 莎车县| 靖安县| 定南县|