第15.20節 PyQt(Python+Qt)入門學習:QColumnView的作用及開發中對應Model的使用


一、概述

在Qt Designer的Item Views(Model-based)部件中,Column View部件是一種類似樹形視圖的視圖,不過樹形視圖的層次結構是縱向排列的,父節點在上,子節點在下,同時兄弟節點也是上下排列,而在Column View中,這種層級關系是通過視圖中的列來體現的,兄弟節點是上下排列,但父子節點是橫向排列,父節點在左列,子節點在父節點的右邊,並通過多列來支持多級父子關系,從展示效果來看,Column View部件的展示數據在視圖中是一列一列的展示,每列數據就是一列表視圖中的數據。由於橫向展示數據對視覺的限制,這種層次結構不能太多,否則體驗不好。

Column View對應的類是QColumnView。

二、QColumnView類介紹

2.1、QColumnView類的屬性

QColumnView在Designer中可以維護的屬性就是一個resizeGripsVisible屬性,resizeGripsVisible屬性用於控制QColumnView是否顯示columnView中各個列表之間調整大小間距的手柄,如果為True就展示,可以調節各個列表之間的間距,為False就不展示,也不能調整各個列表的間距。

下圖案例中分為三層,第一層是各洲的列表、第二層是對應洲的國家列表,第三層是對應國家的省。其中黃色標記部分為展示手柄的案例:
在這里插入圖片描述
下圖為不展示手柄的情況:
在這里插入圖片描述

2.2、QColumnView的Model

QColumnView老猿認為本質上是種樹形結構,理論上將樹形視圖能用的存儲Model如QFileSystemModel、QStandardItemModel等QColumnView都可以使用。

三、案例1:使用QFileSystemModel作為columnView的Model

3.1、案例說明

在columnView中展示文件目錄非常簡單,只需要在視圖類的派生類中直接將視圖的Model設置為QFileSystemModel即可。

3.2、案例代碼

class mainWin(QtWidgets.QWidget,columnWin.Ui_columnViewMainWin):
    def __init__(self):
        super(mainWin, self).__init__()
        self.setupUi(self)
        self.model = QtWidgets.QFileSystemModel()
        self.model.setRootPath(r"c:\temp")
        self.columnView.setModel(self.model)

上述代碼中columnWin為對Qt Designer中設計的界面生成的代碼對應模塊,Ui_columnViewMainWin為界面代碼生成對象的類名。

3.3、案例運行界面

在這里插入圖片描述

四、案例2:使用QStandardItemModel作為columnView的Model

4.1、案例說明

本案例設定的層級數據為:洲–國--省的層級映射數據,數據定義如下:

        continents = ['亞洲','北美洲','歐洲','...']
        countries =[['中國','日本','韓國','朝鮮','...'],['美國','加拿大','墨西哥','...'],['英國','法國','德國','...'],['...']]
        provinces =[[['北京','上海','廣州','武漢','...'],['東京','北海道','九州','...'],['...'],['...'],['...']],
                    [['...'],['...'],['...'],['...']],
                    [['...'],['...'],['...'],['...']],
                    [['...'], ['...'], ['...'], ['...']]
                    ]

其中省略號表示剩余的其余數據。
案例中按上述continents(洲)、countries( 國)、provinces(省)的層級建立Model,並添加對應列表中的數據,添加的項需要使用QStandardItem來構建。

4.2、案例代碼

class mainWin(QtWidgets.QWidget,columnWin.Ui_columnViewMainWin):
    def __init__(self):
        super(mainWin, self).__init__()
        self.setupUi(self)
        #self.initModel()
        self.initDirModel()

    def initModel(self):
        continents = ['亞洲','北美洲','歐洲','...']
        countries =[['中國','日本','韓國','朝鮮','...'],['美國','加拿大','墨西哥','...'],['英國','法國','德國','...'],['...']]
        provinces =[[['北京','上海','廣州','武漢','...'],['東京','北海道','九州','...'],['...'],['...'],['...']],
                    [['...'],['...'],['...'],['...']],
                    [['...'],['...'],['...'],['...']],
                    [['...'], ['...'], ['...'], ['...']]
                    ]
        self.model = QtGui.QStandardItemModel()
        continentIndex = 0
        for continent in continents:
            continentModel = QtGui.QStandardItem (continent)
            countryIndex = 0
            for country in countries[continentIndex]:
                countryModel  = QtGui.QStandardItem(country)
                continentModel.appendRow(countryModel)
                for province in provinces[continentIndex][countryIndex]:
                    provincesModel = QtGui.QStandardItem(province)
                    countryModel.appendRow(provincesModel)
                countryIndex += 1


            self.model.appendRow(continentModel)
            continentIndex += 1
        self.columnView.setModel(self.model)
        

4.3、案例執行截圖

在這里插入圖片描述

老猿Python,跟老猿學Python!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM