轉載地址: http://blog.sina.com.cn/s/blog_9b78c91101019sgi.htmlhtml
QTableWidget是QT程序中經常使用的顯示數據表格的空間,很相似於VC、C#中的DataGrid。python
說到QTableWidget,就必須講一下它跟QTabelView的區別了。QTableWidget是QTableView的子類,主要的區別是QTableView可使用自定義的數據模型來顯示內容(也就是先要經過setModel來綁定數據源),而QTableWidget則只能使用標準的數據模型,而且其單元格數據是QTableWidgetItem的對象來實現的(也就是不須要數據源,將逐個單元格內的信息填好便可)。小程序
這主要體如今QTableView類中有setModel成員函數,而到了QTableWidget類中,該成員函數變成了私有。app
使用QTableWidget就離不開QTableWidgetItem。QTableWidgetItem用來表示表格中的一個單元格,正個表格都須要用逐個單元格構建起來。函數
繼承圖:測試
QtableWidget是繼承於QtableView的。因此QtableView的方法也在QtableWidget中繼承了。
QTableWidget類提供了一個默認模式的表格,它是基於Item的,這個Item是由QTableWidgetItem提供的。若是你要構建本身的數據模式,請使用QTableView而不是QTableWidget。字體
一個簡單的QTableWidget小程序:ui
1 #!/usr/bin/env python 2 #coding=utf-8 3 from PyQt4.QtGui import * #目測table的類應該是在qt.gui裏面的 4 from PyQt4.QtCore import * 5 class MyDialog(QDialog): 6 def __init__(self, parent=None): 7 super(MyDialog, self).__init__(parent) 8 self.MyTable = QTableWidget(4,3) 9 self.MyTable.setHorizontalHeaderLabels(['姓名','身高','體重']) 10 11 newItem = QTableWidgetItem("松鼠") 12 self.MyTable.setItem(0, 0, newItem) 13 14 newItem = QTableWidgetItem("10cm") 15 self.MyTable.setItem(0, 1, newItem) 16 17 newItem = QTableWidgetItem("60g") 18 self.MyTable.setItem(0, 2, newItem) 19 20 layout = QHBoxLayout() 21 layout.addWidget(self.MyTable) 22 self.setLayout(layout) 23 24 25 if __name__ == '__main__': 26 import sys 27 app = QApplication(sys.argv) 28 myWindow = MyDialog() 29 myWindow.show() 30 sys.exit(app.exec_())
self.MyTable = QTableWidget(4,3) 構造了一個QTableWidget的對象,而且設置爲4行,3列
self.MyTable.setHorizontalHeaderLabels(['姓名','身高','體重']) 則設置表格的表頭
newItem = QTableWidgetItem("松鼠") 則是生成了一個QTableWidgetItem的對象,並讓其名爲「松鼠」
self.MyTable.setItem(0, 0, newItem) 將剛纔生成的Item加載到第0行、0列處spa
運行結果以下:指針
在默認狀況下,表格裏的字符是能夠更改的,好比雙擊一個單元格,就能夠修改原來的內容,若是想禁止用戶的這種操做,讓這個表格對用戶只讀,能夠這樣:
self.MyTable.setEditTriggers(QAbstractItemView.NoEditTriggers) #MyTable是上面代碼中生成的QTableWidget對象
QAbstractItemView.NoEditTriggers是QAbstractItemView.EditTrigger枚舉中的一個,都是觸發修改單元格內容的條件:
QAbstractItemView.NoEditTriggers | 0 | No editing possible. 不能對錶格內容進行修改 |
QAbstractItemView.CurrentChanged | 1 | Editing start whenever current item changes.任什麼時候候都能對單元格修改 |
QAbstractItemView.DoubleClicked | 2 | Editing starts when an item is double clicked.雙擊單元格 |
QAbstractItemView.SelectedClicked | 4 | Editing starts when clicking on an already selected item.單擊已選中的內容 |
QAbstractItemView.EditKeyPressed | 8 | Editing starts when the platform edit key has been pressed over an item. |
QAbstractItemView.AnyKeyPressed | 16 | Editing starts when any key is pressed over an item.按下任意鍵就能修改 |
QAbstractItemView.AllEditTriggers | 31 | Editing starts for all above actions.以上條件全包括 |
self.MyTable.setSelectionBehavior(QAbstractItemView.SelectRows) #整行選中的方式
QAbstractItemView.SelectionBehavior枚舉還有以下類型:
Constant | Value | Description |
---|---|---|
QAbstractItemView.SelectItems | 0 | Selecting single items.選中單個單元格 |
QAbstractItemView.SelectRows | 1 | Selecting only rows.選中一行 |
QAbstractItemView.SelectColumns | 2 | Selecting only columns.選中一列 |
self.MyTable.setSelectionMode(QAbstractItemView.ExtendedSelection) #設置爲能夠選中多個目標
該函數的參數還能夠是:
QAbstractItemView.NoSelection 不能選擇
QAbstractItemView.SingleSelection 選中單個目標
QAbstractItemView.MultiSelection 選中多個目標
QAbstractItemView.ExtendedSelection QAbstractItemView.ContiguousSelection 的區別不明顯,主要功能是正常狀況下是單選,但按下Ctrl或Shift鍵後,能夠多選
對於水平或垂直方法的表頭,能夠用如下方式進行 隱藏/顯示 的設置:
self.MyTable.verticalHeader().setVisible(False)
self.MyTable.horizontalHeader().setVisible(False)
就將全部的表頭都隱藏起來了,效果以下:
textFont = QFont( "song" , 12 , QFont.Bold)
for x in range(self.MyTable.columnCount()): headItem = self.MyTable.horizontalHeaderItem(x) #得到水平方向表頭的Item對象 headItem.setFont(textFont) #設置字體 headItem.setBackgroundColor(QColor(0,60,10)) #設置單元格背景顏色 ######################經測試,該setBackgroundColor 方法無效!!!
headItem.setTextColor(QColor(200,111,30)) #設置文字顏色
QTableWidget不只容許把文字加到單元格,還容許把控件也放到單元格中。好比,把一個下拉框加入單元格,能夠這麼作:
self.MyCombo = QComboBox() self.MyCombo.addItem("√") self.MyCombo.addItem("×") self.MyTable.setCellWidget(1,0,self.MyCombo) #注意行列是從0開始計數的
先生成一個QComboBox的對象, 再用QTableWidget類中的setCellWidget函數,將其填入指定的單元格中
newItem = QTableWidgetItem("松鼠") newItem.setBackgroundColor(QColor(0,60,10)) newItem.setTextColor(QColor(200,111,100)) self.MyTable.setItem(0, 0, newItem)
經過QTableWidgetItem類的setBackgroundColor、setTextColor函數來實現
textFont = QFont("song", 12, QFont.Bold) newItem = QTableWidgetItem("松鼠") #newItem.setBackgroundColor(QColor(0,60,10)) #newItem.setTextColor(QColor(200,111,100)) newItem.setFont(textFont) self.MyTable.setItem(0, 0, newItem)
首先,先生成一個字體QFont對象,並將其字體設爲宋體,大小設爲12,而且加粗
再利用單元格的QTableWidgetItem類中的setFont加載給特定的單元格。若是須要對全部的單元格都使用這種字體,則可使用
self.MyTable.setFont(testFont) #利用QTableWidget類中的setFont成員函數,將全部的單元格都設成該字體
這個比較簡單,使用newItem.setTextAlignment()函數便可,該函數的參數爲單元格內的對齊方式,和字符輸入順序是自左相右仍是自右向左。
水平對齊方式有:
Constant | Value | Description |
---|---|---|
Qt.AlignLeft | 0x0001 | Aligns with the left edge. |
Qt.AlignRight | 0x0002 | Aligns with the right edge. |
Qt.AlignHCenter | 0x0004 | Centers horizontally in the available space. |
Qt.AlignJustify | 0x0008 | Justifies the text in the available space. |
垂直對齊方式:
Constant | Value | Description |
---|---|---|
Qt.AlignTop | 0x0020 | Aligns with the top. |
Qt.AlignBottom | 0x0040 | Aligns with the bottom. |
Qt.AlignVCenter | 0x0080 | Centers vertically in the available space. |
若是兩種都要設置,只要用 Qt.AlignHCenter | Qt.AlignVCenter 的方式便可
self.MyTable.setSpan(0, 0, 3, 1) # 其參數爲: 要改變單元格的 1行數 2列數 要合併的 3行數 4列數
首先,能夠指定某個行或者列的大小
self.MyTable.setColumnWidth(2,50) #將第2列的單元格,設置成50寬度 self.MyTable.setRowHeight(2,60) #將第2行的單元格,設置成60的高度
還能夠將行和列的大小設爲與內容相匹配
self.MyTable.resizeColumnsToContents() #將列調整到跟內容大小相匹配 self.MyTable.resizeRowsToContents() #將行大小調整到跟內容的大學相匹配
經過實現 itemClicked (QTableWidgetItem *) 信號的槽函數,就能夠得到鼠標單擊到的單元格指針,進而得到其中的文字信息
self.connect(self.MyTable, SIGNAL("itemClicked (QTableWidgetItem*)"), self.outSelect) #將itemClicked信號與函數outSelect綁定
而後實現一個outSelect函數,以下:
def outSelect(self, Item=None): if Item==None: return print(Item.text())
運行程序後,單擊一個單元格,便可得到其中的字符了