一、概述
在Designer的部件欄Item Views中提供了PyQt和Qt已經實現好的table View(表視圖)部件,table View對應的類為QTableView,QTableView類提供表視圖的默認Model/View實現。這兒的所說的表視圖老猿理解為類似通過行和列定位數據的表格形式的數據展現方式。
QTableView是PyQt和Qt提供的一種表視圖的實現,用於顯示存儲在Model模型中的數據項。QTableView類是Model/View類之一,是QtModel/View框架的一部分。
QTableView實現QAbstractItemView類定義的接口,以便於在視圖中顯示從QAbstractItemModel類派生的Model模型提供的數據。
在QTableView對應視圖中,可以通過用鼠標單擊單元格或使用箭頭鍵來在表格中的數據之間切換。因為QTableView在默認情況下啟用tabKeyNavigation屬性,所以可以使用Tab和Backtab鍵在單元格之間前后移動。
QTableView對應視圖可以顯示垂直表頭(類似列名)和水平表頭(類似行標題),可以根據需要對表頭進行隱藏或展示。
二、QTableView屬性介紹
2.1、Designer中QTableView相關的屬性
在Designer中Item Views中的table View的屬性只有showGrid、gridStyle、sortingEnabled、wordWrap、cornerButtonEnbaled以及Header這些屬性,如圖:
2.2、showGrid屬性
showGrid屬性用於控制視圖中數據項之間是否顯示網格,如果該屬性為True,則繪制網格;如果該屬性為False,則不繪制網格。
showGrid屬性默認值為True,可以通過showGrid() 和setShowGrid(bool show)來訪問或設置該屬性。
2.3、gridStyle屬性
gridStyle屬性用於控制視圖數據網格的樣式,此屬性只有在showGrid屬性為True時才有作用。
gridStyle屬性的類型為枚舉類型Qt.PenStyle,其取值及含義如下:
相關線條示例
相關方法
可以使用gridStyle() 、setGridStyle(Qt.PenStyle style)方法訪問或設置gridStyle屬性。
2.3、sortingEnabled屬性
sortingEnabled屬性用於控制是否啟用視圖按列排序功能,如果此屬性為True,則對tableView視圖中的數據啟用排序,如果此屬性為False,則不啟用排序。默認值為False。
當啟用排序后,在視圖的表頭中排序列升序排序則有正三角形標記,倒序則有倒三角標記,如圖:
當點擊表頭的其他列時,則排序以點擊列進行重新排序。如圖以內容字段倒序排序:
可以通過方法isSortingEnabled()、setSortingEnabled(bool enable)對該屬性進行訪問和設置。
2.4、wordWrap屬性
wordWrap屬性用於控制視圖中數據項文本的換行策略。如果此屬性為True,則在數據項文本中分詞的適當處進行換;否則數據項文本不進行換行處理。默認情況下,此屬性為True。
請注意,即使啟用了換行,單元格也不會展開以適合所有文本,如果數據項的空間無法展示所有內容,則會根據textElideMode設定的省略號模式在文本中插入省略號。
該屬性可以通過wordWrap()和setWordWrap(bool wordWrap)來進行訪問和設置。
2.5、cornerButtonEnabled屬性
cornerButtonEnabled屬性用於控制是否啟用左上角的按鈕。如果此屬性為True,則啟用視圖左上角的按鈕,單擊此按鈕將選擇表視圖中的所有數據,否則此按鈕點擊沒有任何作用。
默認情況下,此屬性為True。可以通過isCornerButtonEnabled() 、setCornerButtonEnabled(bool enable)來訪問和設置此屬性。
如圖:
在cornerButtonEnabled為True的情況下,點擊上圖藍色標記的視圖左上角按鈕則會將視圖中所有數據選中。
2.6、標題表頭相關屬性
2.6.1、概述
在Qt Designer中,對於表視圖QTableView,在屬性在下面有專門一欄列出了跟標題相關的屬性,如圖:
這些屬性並不是QTableView的直接屬性,而是QTableView的horizontalHeader和verticalHeader兩個屬性的子屬性。
2.6.2、horizontalHeader和verticalHeader
horizontalHeader和verticalHeader分別表示視圖數據項的水平標題(或稱為水平表頭,對應個列名)和垂直標題(或稱為垂直表頭,對應各行標題),水平標題表示每列的標題如字段名,垂直標題表示每行的標題如行號。
horizontalHeader和verticalHeader分別通過QTableView的horizontalHeader()和verticalHeader()方法獲取,返回類型為QHeaderView類型,可以通過QTableView的方法setVerticalHeader(QHeaderView header)、setHorizontalHeader(QHeaderView header)來設置。
2.6.3、Qt Designer標題屬性與QHeaderView對應關系
2.6.3.1、horizontalHeaderVisible和verticalHeaderVisible
這兩個屬性都對應QHeaderView的visible屬性,表示標題是否可見,該屬性實際上是從QWidget繼承過來的屬性,可以通過isVisible()、setVisible(bool visible)進行訪問。
2.6.3.2、horizontalCascadingSectionResizes和verticalCascadingSectionResizes屬性
horizontalCascadingSectionResizes和verticalCascadingSectionResizes這兩個屬性都對應QHeaderView的CascadingSectionResizes屬性,
CascadingSectionResizes屬性用於控制當用戶調整標題的區域(sections)大小達到其最小值時,是否將交互式大小調整級聯到下一區域。關於這個屬性大家可以參考《PyQt(Python+Qt)學習隨筆:QHeaderView的CascadingSectionResizes屬性》相關的介紹。
2.6.3.3、horizontalHeaderDefaultSectionSize和verticalHeaderDefaultSectionSize屬性
horizontalHeaderDefaultSectionSize和verticalHeaderDefaultSectionSize這兩個屬性都對應QHeaderView的defaultSectionSize屬性,defaultSectionSize用於控制標題頭各字段區域的在重寫調整大小之前的默認大小。
注意:defaultSectionSize這個屬性的值僅對大小調整模式resizeMode設置為 Interactive 或 Fixed時有效。
默認情況下,此屬性的值依賴於樣式。因此,當樣式更改時,此屬性將同時根據樣式的設置更新。當代碼調用setDefaultSectionSize()后,此屬性就不再受樣式的影響,而調用resetDefaultSectionSize()將恢復根據樣式的設置更新。
可以使用方法defaultSectionSize()、setDefaultSectionSize(int size)來訪問和設置該屬性的值。
2.6.3.4、horizontalHeaderHighlightSections和verticalHeaderHighlightSections屬性
horizontalHeaderHighlightSections和verticalHeaderHighlightSections這兩個屬性對應QHeaderView的highlightSections屬性,highlightSections屬性用於控制當選擇了tableView視圖中數據項時,對應的表頭區域是否高亮。
可以通過方法highlightSections() 、setHighlightSections(bool highlight)來訪問或設置該屬性相關的值。
2.6.3.5、horizontalHeaderMinimumSectionSize和verticalHeaderMinimumSectionSize屬性
horizontalHeaderMinimumSectionSize和verticalHeaderMinimumSectionSize這兩個屬性對應QHeaderView的minimumSectionSize屬性,該屬性用於控制表頭各字段區域的最小大小。
minimumSectionSize是允許的最小尺寸,如果設置為-1,QHeaderView將使用globalStrut(globalStrut是用於控制所有界面交互元素的最小大小)的最大值或fontMetrics(fontMetrics為當前部件字體對應的字符或字符串大小的計算度量數據,如baseline(基線)、width、asent(超出基線的高度)、decent(基線之下的高度))指定的大小。
minimumSectionSize屬性的設置對所有大小調整模式都有效。
2.6.3.6、horizontalHeaderShowSortIndicator和verticalHeaderShowSortIndicator屬性
horizontalHeaderShowSortIndicator和verticalHeaderShowSortIndicator這兩個屬性對應QHeaderView的showSortIndicator屬性,showSortIndicator屬性用於控制表頭是否顯示排序標記。排序標記會顯示在當前點擊選擇的標題字段上。
注意在排序標記顯示屬性showSortIndicator為True的情況下:
- 在首次顯示視圖時,默認顯示在第一列和第一行的標題上,但此時如果應用數據未進行排序處理,實際顯示數據是按數據生成順序顯示;
- 當點擊水平標題時,就會按點擊字段對視圖數據排序顯示,再次點擊就會反序顯示;
- 當點擊豎直標題時,排序標記會變化,但視圖中的數據無變化,如果需要變化,應用需要進行調整。
以上情況是老猿驗證的情況,最后一點是否正確老猿暫時不能完全確認。
showSortIndicator屬性可以通過方法isSortIndicatorShown() 、setSortIndicatorShown(bool show)進行訪問或設置。
2.6.3.7、horizontalHeaderStretchLastSection和verticalHeaderStretchLastSection屬性
horizontalHeaderStretchLastSection和verticalHeaderStretchLastSection這兩個屬性對應QHeaderView的stretchLastSection屬性,stretchLastSection屬性用於控制最后一個顯示的表頭是否占用視圖中所有可用空間。
stretchLastSection屬性默認值為False,可以通過stretchLastSection()、setStretchLastSection(bool stretch)方法進行訪問和設置。
一般情況下,只有水平表頭才需要設置該屬性,豎直表頭也可以設置該屬性,並且在視圖中數據行數不多時會拉伸最后一行數據占用整個視圖的空間,但並沒有多少實際意義。
三、小結
本節詳細介紹了QTableView對應的表視圖在Designer中相關的屬性的含義及訪問方法,並介紹了表視圖整體的功能和作用。總體來說表視圖就是類似展現表格數據的視圖,它可以和存儲為關系型數據庫中的表、excel表格中的數據對應Model配合使用。表格可以設置行名、列名、行高、列高,可以設置是否展示網格以及網格的線條是什么形狀等相關的外觀。
廣告
老猿關於PyQt的付費專欄《使用PyQt開發圖形界面Python應用》只需要9.9元,該部分與第十五章的內容基本對應,但同樣內容在付費專欄上總體來說更詳細、案例更多。本節內容在付費專欄的《第十九章、Model/View開發:QTableView的功能及屬性》。如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。