一、概述
在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)