Python深度學習實戰(zhàn)PyQt5窗口切換的堆疊布局示例詳解
軟件項目中經(jīng)常需要多種不同的圖形界面,以適應不同的任務場景。選項卡控件(QTackedWidget)通過標簽選擇打開對應的對話框頁面,不需要另外編程。堆疊窗口控件(QStackedWidget)在主程序中通過編程來控制顯示的圖形界面,相對比較復雜,但也更加通用和靈活。
1. 堆疊布局簡介
1. 1什么是堆疊布局(Stacked Layout)
布局管理就是管理圖形窗口中各個部件的位置和排列。圖形窗口中的大量部件也需要通過布局管理,對部件進行整理分組、排列定位,才能使界面友好。上一篇文中我們介紹了基本的水平布局、垂直布局、柵格布局、表格布局和進階的嵌套布局和容器布局。
在容器布局中,通過容器控件(Containers)與布局管理器(Layouts)的結合,可以實現(xiàn)對程序窗口的分割和布局,就可以自由設計各種豐富的圖形界面。
在實際的軟件項目中,通常需要多種/多個不同的圖形界面,以適應不同的任務場景。如何實現(xiàn)多窗口圖形界面的需求呢?大致來說有幾種思路:
- 使用彈出窗口。主窗口提供基本界面,通過彈出窗口實現(xiàn)子任務界面,子任務結束后關閉彈出窗口回到主窗口。
這是一種可行的,也比較簡單的處理方案,很多應用程序中都設有彈出窗口。但是頻繁彈出和關閉窗口的用戶體驗不好,而且在窗口之間的切換不方便。 - 重建圖形界面。當調(diào)用新的圖形界面時,關閉后刪除現(xiàn)有界面上的所有控件,再新建需要的各種控件。
這種方案雖然可行,但是編程復雜、浪費資源、容易出錯,難以適應多窗口相互切換的要求,因此很少使用。在 QtDesigner 中也不支持這種方案的操作。 - 通過堆疊布局實現(xiàn)多窗口切換。堆疊布局是在窗口的整體或局部區(qū)域設置多組圖形界面,根據(jù)需要使用指定的圖形界面。
打個比方,這就好比戲劇或拍照中準備了多種背景幕布,需要什么場景,就展開所需的場景幕布,而把其它幕布收起來。
1.2 堆疊布局的實現(xiàn)方法
QStackedLayout 類提供了多頁面切換的堆疊布局。
選項卡控件(QTackedWidget)提供了選項卡對話框,外觀類似于瀏覽器頁面打開多個標簽頁。選項卡控件允許創(chuàng)建多個對話框頁面,每個頁面帶有自己的標簽。使用時點擊標簽行進行選擇,就打開對應的對話框頁面,不需要另外編程。
堆疊窗口控件(QStackedWidget)提供了更加通用和靈活的多窗口、多頁面切換的解決方案。QStackedWidget 控件可以添加在整個窗口或窗口中的任意區(qū)域,允許在堆疊窗口區(qū)域內(nèi)設計多個頁面,在程序控制使用指定的窗口界面。
堆疊窗口控件(QStackedWidget)需要在主程序中通過編程來控制顯示的圖形界面,相對于選項卡控件(QTackedWidget) 來說比較復雜,但因此也更加靈活。
本文以堆疊窗口控件(QStackedWidget)為例,詳細介紹堆疊布局的界面設計和程序實現(xiàn)過程。
2. 創(chuàng)建多窗口切換的堆疊布局
(1)以上文 uiDemo6.ui 為基礎:圖形窗口的左側上部為垂直布局的按鈕控件區(qū)域 leftLayout_1,設有多個按鈕控件,用于選擇不同的業(yè)務;左側下部為垂直布局的文本區(qū)域 leftLayout_2,設有文本顯示框。
(2)將圖形窗口右側的主體區(qū)域設計為堆疊窗口,用于設計多個圖形界面,以適應不同的業(yè)務場景:
在 QtDesigner 左側工具欄 “Containers” 類中,選擇 “Stacked Widget” 控件,將其拖動至設計的圖形窗口中,創(chuàng)建堆疊布局的容器控件。
- 對窗口中的堆疊容器 “Stacked Widget”,選中后可以用鼠標拖動、拉伸來調(diào)整控件的位置和大小,或者在 “屬性編輯器” 中設置 (X, Y)、寬度、高度屬性。
- 堆疊容器 “Stacked Widget” 自動建立了 2個頁面。鼠標位于堆疊容器 “Stacked Widget” ,右鍵喚出下拉菜單,選擇 "插入頁"可以插入新的頁面,選擇 “改變頁順序” 可以調(diào)整各頁面的順序。
- 在控件的右上角顯示有一對黑色三角符號,可以在多個頁面之間切換,也可以在 “對象查看器” 中選擇要編輯的頁面。
(3)堆疊容器 “Stacked Widget” 中各頁面的設計,具體設計內(nèi)容是根據(jù)業(yè)務需要確定的。
- page_0 的設計:標簽控件 label_1 用于顯示封面圖片,按鈕控件 pushButton_6~8 用于控制翻頁;
- page_1 的設計:水平布局的標簽控件 label_2、label_3 用于顯示原始圖片和處理圖片,控件用于控制處理方法和參數(shù),按鈕控件 pushButton_9~11 用于控制翻頁;
- page_2 的設計:表格控件 tableWidget 控件用于顯示表格數(shù)據(jù),按鈕控件用于控制。
將完成的堆疊布局界面設計文件另存為 uiDemo8.ui,不同頁面的編輯狀態(tài)如下圖所示:
堆疊布局 page_0 設計圖:

堆疊布局 page_1 設計圖:

堆疊布局 page_2 設計圖:

3. 堆疊布局的主程序設計
使用堆疊窗口控件(QStackedWidget)建立的堆疊布局界面,要在主程序中通過編程控制顯示哪一個圖形界面。
3.1 QStackedWidget 類
QStackedWidget 類繼承自 QFrame類。QStackedWidge t類提供了多頁面切換的布局,一次只能看到一個界面。
QStackedWidget 類的信號:
- currentChanged(int index):當前頁面發(fā)生變化時候發(fā)射,index 為新的索引值。
- widgetRemoved(int index):頁面被移除時候發(fā)射,index 為頁面對應的索引值。
QStackedWidget 類的槽函數(shù):
- setCurrentIndex(int index):設置索引 index 所在的頁面為當前頁面。
- setCurrentWidget(QWidget *widget):設置QWidget頁面為當前頁面。
簡單地說,使用如下程序可以設置 page_0 為當前顯示的頁面:
pageNo = 0 # 設置 page_0 為索引頁(第一頁面)
self.stackedWidget.setCurrentIndex(pageNo) # 設置使用 pageNo=0 作為當前顯示頁面
需要注意的是,不論我們?yōu)槊總€頁面控件設置的名稱(objectName)是什么,在 QStackedWidget 類中定義的頁面索引 index 都是一個從 0 開始計數(shù),即:第一頁面的索引值 index=0,第二頁面的索引值 index=1,…。
因此,為了避免混淆,建議將 StackedWidge 控件的第一頁面命名為 objectName: page_0,第二頁面命名為 objectName: page_1,…

3.2 建立信號/槽連接
建立信號/槽連接,既可以在 QtDesigner 中設置,也可以在主程序中通過程序實現(xiàn)。
以下例程是在程序中建立信號/槽連接。
# 通過 connect 建立信號/槽連接,點擊按鈕事件發(fā)射 triggered 信號,執(zhí)行相應的子程序 click_pushButton
self.pushButton_1.clicked.connect(self.click_pushButton_1) # 點擊 pushButton_1 觸發(fā)
self.pushButton_2.clicked.connect(self.click_pushButton_2) # 點擊 pushButton_2 觸發(fā)
self.pushButton_3.clicked.connect(self.click_pushButton_3) # 點擊 pushButton_3 觸發(fā)
3.3 頁面控制程序
通過編程控制堆疊窗口控件的顯示頁面,就是說當前顯示哪一個圖形界面。
一種簡單的方法是,在任務場景的子程序中,直接使用 setCurrentIndex() 設置選擇堆疊控件的顯示頁面。通俗的說就是,任務需要使用哪個場景時,就在程序中編寫頁面設置語句進行選擇。例如:
def click_pushButton_1(self): # 點擊 pushButton_1 觸發(fā)
self.textEdit.append("當前動作: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
另一種高級的應用方法是,通過自定義頁面控制函數(shù),獲取當前信號 sender 檢索 objectName,來選擇堆疊窗口控件的顯示頁面。這種方法更清晰地體現(xiàn)業(yè)務與界面的分離。例如:
def frameController(self): # 頁面控制函數(shù)
sender = self.sender().objectName() # 獲取當前信號 sender
index = {
"pushButton_1": 0, # page_0
"pushButton_2": 1, # page_1
"pushButton_3": 2, # page_2
}
self.stackedWidget.setCurrentIndex(index[sender]) # 根據(jù)信號 index 設置所顯示的頁面
3.4 堆疊布局中的控件操作
控件操作包括控件發(fā)出信號和在槽函數(shù)中進行操作。
在用戶編寫的程序中,需要接收控件信號、或在槽函數(shù)中對控件進行操作,都要通過控件的 objectName 來實現(xiàn)。
例如,點擊按鈕 “第一章”(pushButton_1),就選擇堆疊布局頁面 “page_0”;要在標簽控件 “l(fā)abel_1” 顯示圖片 “…/image/fractal01.png”,就使用以下的程序:
self.label_1.setPixmap(QtGui.QPixmap("../image/fractal01.png"))
而對于堆疊布局頁面 “page_0” 中的按鈕控件 “上一張”、“下一張”、“返回”,要實現(xiàn)點擊按鈕時執(zhí)行相應的任務,則應以控件的 objectName 建立觸發(fā)信號與槽函數(shù)的連接。例如:
# 通過 connect 建立信號/槽連接,點擊按鈕事件發(fā)射 triggered 信號,執(zhí)行相應的子程序 click_pushButton
self.pushButton_6.clicked.connect(self.click_pushButton_6) # 點擊按鈕 "上一張" 觸發(fā)
self.pushButton_7.clicked.connect(self.click_pushButton_7) # 點擊按鈕 "下一張" 觸發(fā)
self.pushButton_8.clicked.connect(self.click_pushButton_8) # 點擊按鈕 "返回" 觸發(fā)
需要特別提醒的是:堆疊布局的每個頁面中的各個控件都是相互獨立的不同的控件,具有不同的控件名稱 objectName。
例如,page_0 中的按鈕控件 “上一張”、“下一張”,與 page_1 中的按鈕控件 “上一張”、"下一張"是不同的控件,具有不同的控件名稱 objectName。
從 QtDesigner 可以清楚地看到所有控件名稱及隸屬關系?!皊tackedWidget” 堆疊布局頁面 “page_0” 中的按鈕控件 “上一張”、“下一張”、“返回”,objectName 分別是 pushButton_6、pushButton_7、pushButton_8;而頁面 “page_1” 中的按鈕控件 “上一張”、“下一張”、“返回”,objectName 分別是 pushButton_9、pushButton_10、pushButton_11。

4. 程序運行圖
先上兩張程序運行結果圖。


我們的圖形窗口如圖所示,看起來已經(jīng)有模有樣了。
以上就是Python編程PyQt5項目實戰(zhàn)窗口切換的堆疊布局示例詳解的詳細內(nèi)容,更多關于PyQt5項目實戰(zhàn)項目的堆疊布局的資料請關注腳本之家其它相關文章!
相關文章
python圖形開發(fā)GUI庫pyqt5的基本使用方法詳解
這篇文章主要介紹了python圖形開發(fā)GUI庫pyqt5的基本使用方法詳解,需要的朋友可以參考下2020-02-02
Python使用latexify模塊實現(xiàn)將代碼為數(shù)學公式
latexify 是一個輕量級的 Python 模塊,可以將 Python 代碼轉換為 LaTeX 格式的數(shù)學表達式,這篇文章就來和大家探索一下如何使用latexify模塊實現(xiàn)將代碼為數(shù)學公式吧2023-12-12
python中根據(jù)字符串調(diào)用函數(shù)的實現(xiàn)方法
下面小編就為大家?guī)硪黄猵ython中根據(jù)字符串調(diào)用函數(shù)的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2016-06-06
如何將numpy二維數(shù)組中的np.nan值替換為指定的值
這篇文章主要介紹了將numpy二維數(shù)組中的np.nan值替換為指定的值操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05

