亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

你等待的Python Qt GUI來(lái)啦!順帶送干貨:從Qt C++類(lèi)庫(kù)到

系統(tǒng) 1759 0

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

你等待的Python Qt GUI來(lái)啦!順帶送干貨:從Qt C++類(lèi)庫(kù)到PyQt5_第1張圖片

【京東購(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ì)資料。

你等待的Python Qt GUI來(lái)啦!順帶送干貨:從Qt C++類(lèi)庫(kù)到PyQt5_第2張圖片

圖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í)行下面的指令:

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

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

            ?
          
  1. >>> help(QSpinBox)

指令help(QSpinBox)會(huì)更詳細(xì)地列出QSpinBox類(lèi)的所有屬性和方法,它會(huì)先列出QSpinBox類(lèi)里新定義的屬性和方法,然后依次列出父類(lèi)的屬性和方法。接口函數(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類(lèi)型的輸入?yún)?shù),沒(méi)有返回值。self是Python中所有類(lèi)的接口函數(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類(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ǔ)句:

            ?
          
  1. from PyQt5.QtWidgets import QApplication, QWidget
  2. from PyQt5.QtCore import pyqtSlot, pyqtSignal
  3. 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ǔ)句:

            ?
          
  1. 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所示,其中有一行是:

            ?
          
  1. qmake: QT += gui

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

            ?
          
  1. 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ù))是:

            ?
          
  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類(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)型:

            ?
          
  1. 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)型:

            ?
          
  1. 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)型:

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

在PyQt5中的返回值就是str類(lèi)型:

            ?
          
  1. 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 定義類(lèi)型為type的數(shù)據(jù)列表,而在Python中有內(nèi)建的list數(shù)據(jù)類(lèi)型,所以,Qt C++中的QList 在PyQt5中對(duì)應(yīng)的是list[type]數(shù)據(jù)。例如,Qt C++中用于表示字符串列表的是QStringList類(lèi),在PyQt5中沒(méi)有這個(gè)類(lèi),而是轉(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類(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ù)處理的方法,例如:

            ?
          
  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

您的支持是博主寫(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ì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 女人隐私秘视频黄www免费 | 成人a区 | 久久精品视频16 | 亚洲欧美视屏 | 色综合天天综合网亚洲影院 | 亚洲精品国产美女在线观看 | 男人的天堂免费在线观看 | 一级毛片特级毛片黄毛片 | 一级成人生活片免费看 | 久久精品国产亚洲婷婷 | 4虎 影视 免费 | 亚洲国产精品视频 | 国内精品自在欧美一区 | 东北老妇露脸xxxxx | 日韩高清不卡在线 | 中文字幕在线激情日韩一区 | 国产 欧美 日产久久 | 亚洲综合图片人成综合网 | 91视频精选 | 狠狠操夜夜爽 | 在线亚洲一区二区 | 国产高清国内精品福利 | 国产免费久久精品99 | 天天爱天天射 | 九九视频免费在线 | 狠狠的干狠狠的操 | 一区二区三区精品国产欧美 | 国产91精品高清一区二区三区 | 四虎影视在线影院在线观看观看 | 国产精品色图 | 国产日韩欧美精品一区 | 色偷偷久久一区二区三区 | 久久九九综合 | 91粉嫩萝控精品福利网站 | 天天看天天射天天碰 | 天天在线天天综合网色 | 欧美日本视频一区 | 中国免费一级毛片 | 激情国产视频 | 国内精品视频一区二区八戒 | 成人性生免费视频 |