Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5窗口切換的堆疊布局示例詳解
軟件項(xiàng)目中經(jīng)常需要多種不同的圖形界面,以適應(yīng)不同的任務(wù)場景。選項(xiàng)卡控件(QTackedWidget)通過標(biāo)簽選擇打開對應(yīng)的對話框頁面,不需要另外編程。堆疊窗口控件(QStackedWidget)在主程序中通過編程來控制顯示的圖形界面,相對比較復(fù)雜,但也更加通用和靈活。
1. 堆疊布局簡介
1. 1什么是堆疊布局(Stacked Layout)
布局管理就是管理圖形窗口中各個(gè)部件的位置和排列。圖形窗口中的大量部件也需要通過布局管理,對部件進(jìn)行整理分組、排列定位,才能使界面友好。上一篇文中我們介紹了基本的水平布局、垂直布局、柵格布局、表格布局和進(jìn)階的嵌套布局和容器布局。
在容器布局中,通過容器控件(Containers)與布局管理器(Layouts)的結(jié)合,可以實(shí)現(xiàn)對程序窗口的分割和布局,就可以自由設(shè)計(jì)各種豐富的圖形界面。
在實(shí)際的軟件項(xiàng)目中,通常需要多種/多個(gè)不同的圖形界面,以適應(yīng)不同的任務(wù)場景。如何實(shí)現(xiàn)多窗口圖形界面的需求呢?大致來說有幾種思路:
- 使用彈出窗口。主窗口提供基本界面,通過彈出窗口實(shí)現(xiàn)子任務(wù)界面,子任務(wù)結(jié)束后關(guān)閉彈出窗口回到主窗口。
這是一種可行的,也比較簡單的處理方案,很多應(yīng)用程序中都設(shè)有彈出窗口。但是頻繁彈出和關(guān)閉窗口的用戶體驗(yàn)不好,而且在窗口之間的切換不方便。 - 重建圖形界面。當(dāng)調(diào)用新的圖形界面時(shí),關(guān)閉后刪除現(xiàn)有界面上的所有控件,再新建需要的各種控件。
這種方案雖然可行,但是編程復(fù)雜、浪費(fèi)資源、容易出錯(cuò),難以適應(yīng)多窗口相互切換的要求,因此很少使用。在 QtDesigner 中也不支持這種方案的操作。 - 通過堆疊布局實(shí)現(xiàn)多窗口切換。堆疊布局是在窗口的整體或局部區(qū)域設(shè)置多組圖形界面,根據(jù)需要使用指定的圖形界面。
打個(gè)比方,這就好比戲劇或拍照中準(zhǔn)備了多種背景幕布,需要什么場景,就展開所需的場景幕布,而把其它幕布收起來。
1.2 堆疊布局的實(shí)現(xiàn)方法
QStackedLayout 類提供了多頁面切換的堆疊布局。
選項(xiàng)卡控件(QTackedWidget)提供了選項(xiàng)卡對話框,外觀類似于瀏覽器頁面打開多個(gè)標(biāo)簽頁。選項(xiàng)卡控件允許創(chuàng)建多個(gè)對話框頁面,每個(gè)頁面帶有自己的標(biāo)簽。使用時(shí)點(diǎn)擊標(biāo)簽行進(jìn)行選擇,就打開對應(yīng)的對話框頁面,不需要另外編程。
堆疊窗口控件(QStackedWidget)提供了更加通用和靈活的多窗口、多頁面切換的解決方案。QStackedWidget 控件可以添加在整個(gè)窗口或窗口中的任意區(qū)域,允許在堆疊窗口區(qū)域內(nèi)設(shè)計(jì)多個(gè)頁面,在程序控制使用指定的窗口界面。
堆疊窗口控件(QStackedWidget)需要在主程序中通過編程來控制顯示的圖形界面,相對于選項(xiàng)卡控件(QTackedWidget) 來說比較復(fù)雜,但因此也更加靈活。
本文以堆疊窗口控件(QStackedWidget)為例,詳細(xì)介紹堆疊布局的界面設(shè)計(jì)和程序?qū)崿F(xiàn)過程。
2. 創(chuàng)建多窗口切換的堆疊布局
(1)以上文 uiDemo6.ui 為基礎(chǔ):圖形窗口的左側(cè)上部為垂直布局的按鈕控件區(qū)域 leftLayout_1,設(shè)有多個(gè)按鈕控件,用于選擇不同的業(yè)務(wù);左側(cè)下部為垂直布局的文本區(qū)域 leftLayout_2,設(shè)有文本顯示框。
(2)將圖形窗口右側(cè)的主體區(qū)域設(shè)計(jì)為堆疊窗口,用于設(shè)計(jì)多個(gè)圖形界面,以適應(yīng)不同的業(yè)務(wù)場景:
在 QtDesigner 左側(cè)工具欄 “Containers” 類中,選擇 “Stacked Widget” 控件,將其拖動(dòng)至設(shè)計(jì)的圖形窗口中,創(chuàng)建堆疊布局的容器控件。
- 對窗口中的堆疊容器 “Stacked Widget”,選中后可以用鼠標(biāo)拖動(dòng)、拉伸來調(diào)整控件的位置和大小,或者在 “屬性編輯器” 中設(shè)置 (X, Y)、寬度、高度屬性。
- 堆疊容器 “Stacked Widget” 自動(dòng)建立了 2個(gè)頁面。鼠標(biāo)位于堆疊容器 “Stacked Widget” ,右鍵喚出下拉菜單,選擇 "插入頁"可以插入新的頁面,選擇 “改變頁順序” 可以調(diào)整各頁面的順序。
- 在控件的右上角顯示有一對黑色三角符號,可以在多個(gè)頁面之間切換,也可以在 “對象查看器” 中選擇要編輯的頁面。
(3)堆疊容器 “Stacked Widget” 中各頁面的設(shè)計(jì),具體設(shè)計(jì)內(nèi)容是根據(jù)業(yè)務(wù)需要確定的。
- page_0 的設(shè)計(jì):標(biāo)簽控件 label_1 用于顯示封面圖片,按鈕控件 pushButton_6~8 用于控制翻頁;
- page_1 的設(shè)計(jì):水平布局的標(biāo)簽控件 label_2、label_3 用于顯示原始圖片和處理圖片,控件用于控制處理方法和參數(shù),按鈕控件 pushButton_9~11 用于控制翻頁;
- page_2 的設(shè)計(jì):表格控件 tableWidget 控件用于顯示表格數(shù)據(jù),按鈕控件用于控制。
將完成的堆疊布局界面設(shè)計(jì)文件另存為 uiDemo8.ui,不同頁面的編輯狀態(tài)如下圖所示:
堆疊布局 page_0 設(shè)計(jì)圖:
堆疊布局 page_1 設(shè)計(jì)圖:
堆疊布局 page_2 設(shè)計(jì)圖:
3. 堆疊布局的主程序設(shè)計(jì)
使用堆疊窗口控件(QStackedWidget)建立的堆疊布局界面,要在主程序中通過編程控制顯示哪一個(gè)圖形界面。
3.1 QStackedWidget 類
QStackedWidget 類繼承自 QFrame類。QStackedWidge t類提供了多頁面切換的布局,一次只能看到一個(gè)界面。
QStackedWidget 類的信號:
- currentChanged(int index):當(dāng)前頁面發(fā)生變化時(shí)候發(fā)射,index 為新的索引值。
- widgetRemoved(int index):頁面被移除時(shí)候發(fā)射,index 為頁面對應(yīng)的索引值。
QStackedWidget 類的槽函數(shù):
- setCurrentIndex(int index):設(shè)置索引 index 所在的頁面為當(dāng)前頁面。
- setCurrentWidget(QWidget *widget):設(shè)置QWidget頁面為當(dāng)前頁面。
簡單地說,使用如下程序可以設(shè)置 page_0 為當(dāng)前顯示的頁面:
pageNo = 0 # 設(shè)置 page_0 為索引頁(第一頁面) self.stackedWidget.setCurrentIndex(pageNo) # 設(shè)置使用 pageNo=0 作為當(dāng)前顯示頁面
需要注意的是,不論我們?yōu)槊總€(gè)頁面控件設(shè)置的名稱(objectName)是什么,在 QStackedWidget 類中定義的頁面索引 index 都是一個(gè)從 0 開始計(jì)數(shù),即:第一頁面的索引值 index=0,第二頁面的索引值 index=1,…。
因此,為了避免混淆,建議將 StackedWidge 控件的第一頁面命名為 objectName: page_0,第二頁面命名為 objectName: page_1,…
3.2 建立信號/槽連接
建立信號/槽連接,既可以在 QtDesigner 中設(shè)置,也可以在主程序中通過程序?qū)崿F(xiàn)。
以下例程是在程序中建立信號/槽連接。
# 通過 connect 建立信號/槽連接,點(diǎn)擊按鈕事件發(fā)射 triggered 信號,執(zhí)行相應(yīng)的子程序 click_pushButton self.pushButton_1.clicked.connect(self.click_pushButton_1) # 點(diǎn)擊 pushButton_1 觸發(fā) self.pushButton_2.clicked.connect(self.click_pushButton_2) # 點(diǎn)擊 pushButton_2 觸發(fā) self.pushButton_3.clicked.connect(self.click_pushButton_3) # 點(diǎn)擊 pushButton_3 觸發(fā)
3.3 頁面控制程序
通過編程控制堆疊窗口控件的顯示頁面,就是說當(dāng)前顯示哪一個(gè)圖形界面。
一種簡單的方法是,在任務(wù)場景的子程序中,直接使用 setCurrentIndex() 設(shè)置選擇堆疊控件的顯示頁面。通俗的說就是,任務(wù)需要使用哪個(gè)場景時(shí),就在程序中編寫頁面設(shè)置語句進(jìn)行選擇。例如:
def click_pushButton_1(self): # 點(diǎn)擊 pushButton_1 觸發(fā) self.textEdit.append("當(dāng)前動(dòng)作:click_pushButton_1") self.textEdit.append("選擇堆疊布局頁面:page_0") self.stackedWidget.setCurrentIndex(0) # 打開 stackedWidget > page_0 self.label_1.setPixmap(QtGui.QPixmap("../image/fractal01.png")) return
另一種高級的應(yīng)用方法是,通過自定義頁面控制函數(shù),獲取當(dāng)前信號 sender 檢索 objectName,來選擇堆疊窗口控件的顯示頁面。這種方法更清晰地體現(xiàn)業(yè)務(wù)與界面的分離。例如:
def frameController(self): # 頁面控制函數(shù) sender = self.sender().objectName() # 獲取當(dāng)前信號 sender index = { "pushButton_1": 0, # page_0 "pushButton_2": 1, # page_1 "pushButton_3": 2, # page_2 } self.stackedWidget.setCurrentIndex(index[sender]) # 根據(jù)信號 index 設(shè)置所顯示的頁面
3.4 堆疊布局中的控件操作
控件操作包括控件發(fā)出信號和在槽函數(shù)中進(jìn)行操作。
在用戶編寫的程序中,需要接收控件信號、或在槽函數(shù)中對控件進(jìn)行操作,都要通過控件的 objectName 來實(shí)現(xiàn)。
例如,點(diǎn)擊按鈕 “第一章”(pushButton_1),就選擇堆疊布局頁面 “page_0”;要在標(biāo)簽控件 “l(fā)abel_1” 顯示圖片 “…/image/fractal01.png”,就使用以下的程序:
self.label_1.setPixmap(QtGui.QPixmap("../image/fractal01.png"))
而對于堆疊布局頁面 “page_0” 中的按鈕控件 “上一張”、“下一張”、“返回”,要實(shí)現(xiàn)點(diǎn)擊按鈕時(shí)執(zhí)行相應(yīng)的任務(wù),則應(yīng)以控件的 objectName 建立觸發(fā)信號與槽函數(shù)的連接。例如:
# 通過 connect 建立信號/槽連接,點(diǎn)擊按鈕事件發(fā)射 triggered 信號,執(zhí)行相應(yīng)的子程序 click_pushButton self.pushButton_6.clicked.connect(self.click_pushButton_6) # 點(diǎn)擊按鈕 "上一張" 觸發(fā) self.pushButton_7.clicked.connect(self.click_pushButton_7) # 點(diǎn)擊按鈕 "下一張" 觸發(fā) self.pushButton_8.clicked.connect(self.click_pushButton_8) # 點(diǎn)擊按鈕 "返回" 觸發(fā)
需要特別提醒的是:堆疊布局的每個(gè)頁面中的各個(gè)控件都是相互獨(dú)立的不同的控件,具有不同的控件名稱 objectName。
例如,page_0 中的按鈕控件 “上一張”、“下一張”,與 page_1 中的按鈕控件 “上一張”、"下一張"是不同的控件,具有不同的控件名稱 objectName。
從 QtDesigner 可以清楚地看到所有控件名稱及隸屬關(guān)系。“stackedWidget” 堆疊布局頁面 “page_0” 中的按鈕控件 “上一張”、“下一張”、“返回”,objectName 分別是 pushButton_6、pushButton_7、pushButton_8;而頁面 “page_1” 中的按鈕控件 “上一張”、“下一張”、“返回”,objectName 分別是 pushButton_9、pushButton_10、pushButton_11。
4. 程序運(yùn)行圖
先上兩張程序運(yùn)行結(jié)果圖。
我們的圖形窗口如圖所示,看起來已經(jīng)有模有樣了。
以上就是Python編程PyQt5項(xiàng)目實(shí)戰(zhàn)窗口切換的堆疊布局示例詳解的詳細(xì)內(nèi)容,更多關(guān)于PyQt5項(xiàng)目實(shí)戰(zhàn)項(xiàng)目的堆疊布局的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python圖形開發(fā)GUI庫pyqt5的基本使用方法詳解
這篇文章主要介紹了python圖形開發(fā)GUI庫pyqt5的基本使用方法詳解,需要的朋友可以參考下2020-02-02Python人工智能構(gòu)建簡單聊天機(jī)器人示例詳解
這篇文章主要為大家介紹了Python人工智能構(gòu)建簡單聊天機(jī)器人示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Python使用latexify模塊實(shí)現(xiàn)將代碼為數(shù)學(xué)公式
latexify 是一個(gè)輕量級的 Python 模塊,可以將 Python 代碼轉(zhuǎn)換為 LaTeX 格式的數(shù)學(xué)表達(dá)式,這篇文章就來和大家探索一下如何使用latexify模塊實(shí)現(xiàn)將代碼為數(shù)學(xué)公式吧2023-12-12python中根據(jù)字符串調(diào)用函數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猵ython中根據(jù)字符串調(diào)用函數(shù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧2016-06-06在Python中實(shí)現(xiàn)貪婪排名算法的教程
這篇文章主要介紹了在Python中實(shí)現(xiàn)貪婪排名算法的教程,也是對學(xué)習(xí)算法的一個(gè)很好的演示,需要的朋友可以參考下2015-04-04pyside+pyqt實(shí)現(xiàn)鼠標(biāo)右鍵菜單功能
這篇文章主要為大家詳細(xì)介紹了pyside+pyqt實(shí)現(xiàn)鼠標(biāo)右鍵菜單功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02tensorflow 輸出權(quán)重到csv或txt的實(shí)例
今天小編就為大家分享一篇tensorflow 輸出權(quán)重到csv或txt的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06如何將numpy二維數(shù)組中的np.nan值替換為指定的值
這篇文章主要介紹了將numpy二維數(shù)組中的np.nan值替換為指定的值操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python計(jì)時(shí)相關(guān)操作詳解【time,datetime】
這篇文章主要介紹了Python計(jì)時(shí)相關(guān)操作,涉及time,datetime模塊的使用技巧,包括時(shí)間戳、時(shí)間差、日期格式等操作方法,需要的朋友可以參考下2017-05-05