第15.35節 PyQt編程實戰:結合QDial實現的QStackedWidget堆疊窗口程序例子

一、案例說明

本案例是老猿在學習QStackedWidget中的一個測試案例,該案例使用QStackedWidget展示一個文件目錄下的圖片文件,可以有多種實現方式,在本案例中一個圖片文件使用QStackedWidget的一個頁面窗口展現,有多少圖片文件就有多少頁面窗口。

二、案例實現

2.1、ui界面設計

2.1.1 設計一個顯示圖象文件的窗口對象

在這裏插入圖片描述
該對象中包括一個窗口(QWidget類型的窗口,名稱爲GraphicFileView)和兩個子對象,最上面是一個顯示圖像文件名的label(名稱爲graphicFileName),下面是一個顯示圖像文件的QGraphicsView對象(名稱爲graphicsView),整個ui保存在文件ui_GraphicFileView.ui中。

這個UI窗口用於顯示一個圖像文件,其實例對象作爲QStackedWidget的一個頁面窗口部件對象。

2.1.2、 設計主界面窗口對象

在這裏插入圖片描述
主界面窗口除了主窗口(類型QWidget,名爲mainWin)對象外,還有2個對象,分別是QStackedWidget堆疊窗口對象(名爲stackedWidget),另外有一個QDial對象,名爲dial。

其中stackedWidget就是用於保存所有展示圖像的窗口,dial是一個錶盤,用於控制stackedWidget當前頁面窗口的索引,錶盤上每個刻度對應一個順序索引的數字,該錶盤通過鼠標可以旋轉到任意刻度,可以使用光標控制的上鍵和下鍵逆時針或順時針移動一個刻度。

2.2、實現圖像顯示類

圖像顯示類從ui_GraphicFileView.ui生成的ui_GraphicFileView.py模塊的Ui_GraphicFileView類派生一個子類graphicFileView,該子類實現從指定圖像文件裝載圖像展示,並通過名字爲graphicFileName的label展示圖像文件名。

下面是graphicFileView相關代碼的大致結構:
class graphicFileView(QtWidgets.QWidget,ui_GraphicFileView.Ui_GraphicFileView):
    def __init__(self,filename=None):
        super().__init__()
        self.setupUi(self)
        self.loadGraphicFile (filename)

    def loadGraphicFile(self,fileName):
        if fileName:
            #裝載圖片文件
            ......

2.3、實現主窗口類

主窗口類從ui_mainwin.Ui_mainWin派生,包括構造方法__init__、堆疊窗口初始化方法initPages、錶盤初始化方法initDial、錶盤刻度變化槽方法valueChanged。

相關代碼結構大致如下:
class mainWin(QtWidgets.QWidget,ui_mainwin.Ui_mainWin):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.initPages()
        self.dial.valueChanged.connect(self.valueChanged)

    def initPages(self):
        dir = "F:\\學習\\python\\project\\stackWidget\\資源"
        self.itemCountMinus12 = False
        ...... 
        for file in files:
            
            graphicView = graphicFileView.graphicFileView(filename)
            self.stackedWidget.addWidget(graphicView)
            print(filename)

        self.stackedWidget.setCurrentIndex(0)

        self.initDial()

    def initDial(self):
       
        if self.itemCountMinus12:self.dial.setSingleStep(12)
        else:  self.dial.setSingleStep(1)
	    ......

    def valueChanged(self,value):
        index = value
        ......
        if index:self.stackedWidget.setCurrentIndex(index-1)
        else:self.stackedWidget.setCurrentIndex(count)
注意:
  • 在處理表盤刻度時,根據目錄下的文件數量做了個處理,如果文件數量小於12個,則將最大刻度值設置爲文件數量乘以12,這樣做的目的是爲了將錶盤的空間最小做到12等分
  • 堆疊窗口的個數與文件個數相同,在Designer中設計時將Designer中默認創建的兩個頁面窗口刪除了,所有頁面窗口全部由initPages方法重新創建
  • 程序中沒有異常處理

三、運行界面截圖

下面是運行時的兩個截圖:
在這裏插入圖片描述
在這裏插入圖片描述

廣告

老猿關於PyQt的付費專欄《使用PyQt開發圖形界面Python應用》只需要9.9元,該部分與第十五章的內容基本對應,但同樣內容在付費專欄上總體來說更詳細、案例更多。本節內容對應付費專欄的《PyQt開發案例:結合QDial實現的QStackedWidget堆疊窗口程序例子及完整代碼》。如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。

老猿Python,跟老猿學Python!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章