程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

一文帶你讀懂PyQt:用Python做出與C++一樣的GUI界面應用程序

編輯:Python

[這裡是圖片001]

一、簡介

Python標准庫更多的適合處理後台任務,唯一的圖形庫tkinter使用起來很不方便,所以後來出現了針對Python圖形界面開發的擴展庫,今天老猿要介紹的是主流Python圖形界面擴展庫之一的PyQt。

在介紹PyQt之前,必須先簡單介紹一下Qt。Qt是一個C++可視化開發平台,是一個跨平台的C++圖形用戶界面應用程序框架(C++ GUI),能夠為應用程序開發者提供建立圖形用戶界面所需的功能。Qt是完全面向對象的、易擴展,可應用於組件編程,並可以用於嵌入式開發。它是目前流行的Linux桌面環境KDE 的基礎,是Linux和嵌入式操作系統下的主流圖形界面開發環境,其最大優勢在於只需編寫一次代碼,就能編譯部署在任何操作系統和硬件上。因為擅長圖形界面開發,如今更擴展到移動及嵌入式設備開發。對於商業軟件公司來說極具價值,可以廣泛應用於物聯網特別是智能汽車、智能制造業等的研發。

PyQt是一個創建Python GUI應用程序的工具包,是Qt和Python結合的一個產物,可以說是為了將Qt的功能用於Python開發的一個Qt的Python包裝器。它是Python編程語言和Qt庫的成功融合。

PyQt的整個程序開發框架,老猿認為主要包括如下部分:

  • 圖形界面編輯的工具:Qt Designer
  • 不同部分信息交換機制:信號和槽
  • 界面操作的事件及捕獲機制
  • 一套控制界面顯示和數據存儲分離以及映射的機制:Model/View架構

通過這些重要的工具和框架機制,開發人員可以設計對應的GUI圖形化界面、定義不同部件的操作及響應、捕獲部件或應用的消息以及實現界面顯示組件和數據存儲組件的聯動,從而構造完整的應用程序框架。

二、Qt Designer:PyQt圖形化界面開發的利器

Qt Designer是一個可視化的界面設計工具,可以通過拖拽等方式來設計界面。下面就是Qt Designer的操作界面:

老猿將界面各部分使用紅色數字進行標記,按照數字順序各區域對應功能分別為:

1、界面元素控件區域

這部分提供了Qt所有可視化控件,分為八大類,分別為布局控件(Layouts)、分隔控件(Spacers)、按鈕控件(Buttons)、表項視圖(item views)、表項組件(item widgets)、容器(Containers)、輸入組件(input widgets)、顯示組件(Display widgets),在新建窗口後,可以將各種功能的組件拖拽到窗口上實現可視化的界面設計。

2、菜單及工具欄

本部分是各種操作菜單和對應的工具欄。其中:
File菜單用來新建、打開、打開最近、保存界面的UI文件。
Edit菜單可以編輯界面控件、控件屬性、信號/槽連接、控件Tab順序、標簽和其他控件的伙伴關系等
Form菜單用來編輯當前窗口的布局、大小,預覽窗口等。
View菜單就是看整體界面哪些區域展示出來,即本文中除UI設計工作區的區域哪些展現在界面上;
window菜單就是當前UI設計窗口的切換。

3、UI設計工作區

所有UI設計的工作區,工作區構建的UI作為設計成果保存。

4、組件屬性定義區

這塊完成組件各個屬性的設置,屬性是按組件的類、父類的方式展現的,由於屬性太多單頁沒有展現完,上面截圖沒能體現這點,如果把這些屬性的父節點折疊起來,就可以很清晰的看到這個關系,下圖就是輸入控件的根節點折疊後展示的情況:

可以看到,除了控件自身的QLineEdit類外,還有父類QWidget、QObject,在這個截圖中,這三個是按父類在前、子類在後的順序展現的,據老猿觀察大部分情況都是這樣的,但某些特殊情況可能不是這樣的。如下圖:

上圖中QTreeView控件及其之上的節點都是按父子繼承關系展示的,但下面多了個Header。
通過這些展示信息,我們可以清楚知道哪些屬性是從哪個類帶來的。

5、信號/槽編輯區

信號和槽是Qt最有特色的內容,具體在後面介紹,在這裡可以編輯信號和槽函數的連接關系,但直接按F4進入信號和槽函數連接的界面更方便。

6、動作編輯區

動作Action是Qt抽象的用戶界面操作,Qt中單獨引入的一個對象,對應QAction類。Action表示一個獨立的操作,是將界面上某個可以通過菜單、快捷鍵、toolBar按鈕執行的同一個操作映射到同一個Action對象,由該對象通過信號觸發實際的操作。

三、PyQt三大框架機制之信號和槽

信號和槽是PyQt和Qt特有的信息傳輸機制,是PyQt和Qt設計程序的重要基礎,它可以讓互不干擾的對象建立一種聯系。

信號和槽用於對象間的通信,在一個圖形界面程序中,當一個組件中發生變化時,通常需要通知其他對象,在Qt中當特定事件發生時會發射一個信號來通知需要通知的對象,需要關注的對象就會調用信號連接的槽函數執行響應操作。信號本質上是一個公有函數(或方法)。

槽可以用來接收信號,但槽也是部件派生類的正常成員函數,槽本質上是某個類的方法(包括虛方法),用來調用以響應特定信號,非虛函數的槽函數也可以正常調用,與普通實例的唯一的區別是信號可以連接到它們。

四、PyQt三大框架機制之事件機制

PyQt的圖形界面應用中,事件處理類似於Windows系統的消息處理。一個帶圖形界面的應用程序啟動後,事件處理(如鼠標事件處理、鍵盤事件處理等)就是應用的主循環,事件處理負責接收事件、分發事件、接收應用處理事件的返回結果,在程序中捕獲應用關注的事件觸發相關事件處理是良好UI開發的必經之路。

PyQt中的事件分為應用層級的事件、部件級的事件,所有事件都可以捕獲和過濾,從而影響事件的處理結果。

五、PyQt三大框架機制之Model/View架構

在PyQt和Qt中,Model/View架構是圖形界面開發時用於管理數據和界面展現方式的關系。由該體系架構引入的功能分離使得開發人員能夠更靈活地定制展現數據項的呈現方式,並提供標准模型接口支持廣泛的數據源與預定義好的項視圖(item views)一起使用。

老猿理解Model/View就是Model提供數據訪問,View進行數據呈現,二者可以綁定實現聯動,但界面呈現的風格與數據本身無關。

六、一些老猿使用PyQt做的界面化的案例

老猿是個沒有藝術細胞的人,做的GUI界面說實在的很丑陋,但並不是說PyQt做不出炫酷的界面,恰恰相反,Qt或PyQt都能做出漂亮的界面。

下面是為了說明PyQt多種風格界面的一些老猿做的界面,僅用於說明PyQt能支持的界面風格類型:

  • listView用於文件目錄顯示

  • 用QTableView展示Excel文件

  • 用QTreeWidget顯示目錄文件信息

  • 用QTableWidget操作表格

  • 用QTabWidget選項窗顯示不同操作頁

  • 用QToolBox構建的桌面工具箱

  • 用QStackedWidget構建的堆疊窗口展示多張圖片

  • QMdiArea多文檔界面部件一次展示多張圖片

  • QDockWidget停靠窗(停靠窗請見底部窗口切換選項卡)
  • 用主窗口QMainWindow實現的一個消除視頻Logo的工具

    以上案例的界面設計做得很Low,並不是PyQt的界面設計功能把不行,相信有藝術細胞的人來設計,可以比老猿做的界面漂亮一萬倍。

七、小結

本文介紹了Python的圖形化界面應用開發工具PyQt的功能和開發框架,通過PyQt的這些重要的工具、功能和框架機制,開發人員可以設計對應的GUI圖形化界面、定義不同部件的操作及響應、捕獲部件或應用的消息以及實現界面顯示組件和數據存儲組件的聯動,從而構造完整的應用程序框架,最後提供了老猿實現的一些PyQt開發程序的界面來說明PyQt不同部件的界面風格。

通過以上內容的介紹,有助於對PyQt或Qt不了解的初學者提了解PyQt的基本開發框架、應用界面風格。

當然涉及PyQt,還有QML、PyQt5-sip等特色開發支持能力,這些老猿暫時沒有研究,就不多說了。

更多PyQt開發的內容介紹,請參考老猿PyQT專欄《https://blog.csdn.net/laoyuanpython/category_9702362.html PyQt入門知識》的介紹。

寫博不易,敬請支持:

如果閱讀本文於您有所獲,敬請點贊、評論、收藏,謝謝大家的支持!

關於老猿的付費專欄

  1. 付費專欄《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt開發圖形界面Python應用》專門介紹基於Python的PyQt圖形界面開發基礎教程,對應文章目錄為《 https://blog.csdn.net//article/details/107580932 使用PyQt開發圖形界面Python應用專欄目錄》;
  2. 付費專欄《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音視頻開發專欄 )詳細介紹moviepy音視頻剪輯合成處理的類相關方法及使用相關方法進行相關剪輯合成場景的處理,對應文章目錄為《https://blog.csdn.net//article/details/107574583 moviepy音視頻開發專欄文章目錄》;
  3. 付費專欄《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初學者疑難問題集》為《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python圖形圖像處理 》的伴生專欄,是筆者對OpenCV-Python圖形圖像處理學習中遇到的一些問題個人感悟的整合,相關資料基本上都是老猿反復研究的成果,有助於OpenCV-Python初學者比較深入地理解OpenCV,對應文章目錄為《https://blog.csdn.net//article/details/109713407 OpenCV-Python初學者疑難問題集專欄目錄 》
  4. 付費專欄《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬蟲入門 》站在一個互聯網前端開發小白的角度介紹爬蟲開發應知應會內容,包括爬蟲入門的基礎知識,以及爬取CSDN文章信息、博主信息、給文章點贊、評論等實戰內容。

前兩個專欄都適合有一定Python基礎但無相關知識的小白讀者學習,第三個專欄請大家結合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python圖形圖像處理 》的學習使用。

對於缺乏Python基礎的同仁,可以通過老猿的免費專欄《https://blog.csdn.net/laoyuanpython/category_9831699.html 專欄:Python基礎教程目錄)從零開始學習Python。

如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。

如對文章內容存在疑問,可在博客評論區留言,或關注:老猿Python 微信公號發消息咨詢。

老猿Python,跟老猿學Python!

前往老猿Python博文目錄 https://blog.csdn.net/


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved