pyqt下QTableWidget使用方法小結(轉)

QTableWidget是QT程序中經常使用的顯示數據表格的空間,很相似於VC、C#中的DataGrid。說到QTableWidget,就必須講一下它跟QTabelView的區別了。QTableWidget是QTableView的子類,主要的區別是QTableView可使用自定義的數據模型來顯示內容(也就是先要經過setModel來綁定數據源),而QTableWidget則只能使用標準的數據模型,而且其單元格數據是QTableWidgetItem的對象來實現的(也就是不須要數據源,將逐個單元格內的信息填好便可)。這主要體如今QTableView類中有setModel成員函數,而到了QTableWidget類中,該成員函數變成了私有。使用QTableWidget就離不開QTableWidgetItem。QTableWidgetItem用來表示表格中的一個單元格,正個表格都須要用逐個單元格構建起來。python

 

下面代碼實現了一個最簡單的含有QTableWidget的小程序:小程序

[python] view plain copy print ?
  1. #!/usr/bin/env python   
  2. #coding=utf-8   
  3. from PyQt4.QtGui  import *  
  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(00, newItem)  
  13.           
  14.         newItem = QTableWidgetItem("10cm")  
  15.         self.MyTable.setItem(01, newItem)  
  16.           
  17.         newItem = QTableWidgetItem("60g")  
  18.         self.MyTable.setItem(02, 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_())         

app

 

 

其中:函數

self.MyTable = QTableWidget(4,3)  構造了一個QTableWidget的對象,而且設置爲4行,3列字體

self.MyTable.setHorizontalHeaderLabels(['姓名','身高','體重']) 則設置表格的表頭ui

newItem = QTableWidgetItem("松鼠")   則是生成了一個QTableWidgetItem的對象,並讓其名爲「松鼠」spa

self.MyTable.setItem(0, 0, newItem)    將剛纔生成的Item加載到第0行、0列處.net

 

這樣一個簡單的QTableWidget就構造完成了。指針

 

第一部分:對QTableWidget自己的效果實現code

1.將表格變爲禁止編輯

在默認狀況下,表格裏的字符是能夠更改的,好比雙擊一個單元格,就能夠修改原來的內容,若是想禁止用戶的這種操做,讓這個表格對用戶只讀,能夠這樣:

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.以上條件全包括

 

2.設置表格爲整行選擇

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.選中一列

 

3.單個選中和多個選中的設置:

self.MyTable.setSelectionMode(QAbstractItemView.ExtendedSelection)  #設置爲能夠選中多個目標

該函數的參數還能夠是:

QAbstractItemView.NoSelection      不能選擇

QAbstractItemView.SingleSelection  選中單個目標

QAbstractItemView.MultiSelection    選中多個目標

QAbstractItemView.ExtendedSelection   QAbstractItemView.ContiguousSelection 的區別不明顯,主要功能是正常狀況下是單選,但按下Ctrl或Shift鍵後,能夠多選

 

3.表格表頭的顯示與隱藏

對於水平或垂直方法的表頭,能夠用如下方式進行 隱藏/顯示 的設置:

self.MyTable.verticalHeader().setVisible(False)

self.MyTable.horizontalHeader().setVisible(False)

就將全部的表頭都隱藏起來了,效果以下

 

 

4.對錶頭文字的字體、顏色進行設置

[python] view plain copy print ?
  1. for x in range(self.MyTable.columnCount()):  
  2.     headItem = self.MyTable.horizontalHeaderItem(x)   #得到水平方向表頭的Item對象   
  3.     headItem.setFont(textFont)                        #設置字體   
  4.     headItem.setBackgroundColor(QColor(0,60,10))      #設置單元格背景顏色   
  5.     headItem.setTextColor(QColor(200,111,30))         #設置文字顏色  

 

 

5.在單元格里加入控件:

QTableWidget不只容許把文字加到單元格,還容許把控件也放到單元格中。好比,把一個下拉框加入單元格,能夠這麼作:

[python] view plain copy print ?
  1. self.MyCombo = QComboBox()  
  2. self.MyCombo.addItem("√")  
  3. self.MyCombo.addItem("×")           
  4. self.MyTable.setCellWidget(1,0,self.MyCombo)  

 

先生成一個QComboBox的對象, 再用QTableWidget類中的setCellWidget函數,將其填入指定的單元格中。

 

 

 

第二部分:對單元格的進行設置

 

1.單元格設置字體顏色和背景顏色

[python] view plain copy print ?
  1. newItem = QTableWidgetItem("松鼠")  
  2. newItem.setBackgroundColor(QColor(0,60,10))  
  3. newItem.setTextColor(QColor(200,111,100))          
  4. self.MyTable.setItem(00, newItem)  
  5.           

 

經過QTableWidgetItem類的setBackgroundColor、setTextColor函數來實現

       
2.設置單元格中的字體和字符大小

[python] view plain copy print ?
  1. textFont = QFont("song"12, QFont.Bold)  
  2.           
  3. newItem = QTableWidgetItem("松鼠")  
  4. #newItem.setBackgroundColor(QColor(0,60,10))   
  5. #newItem.setTextColor(QColor(200,111,100))    
  6. newItem.setFont(textFont)  
  7. self.MyTable.setItem(00, newItem)  

 

首先,先生成一個字體QFont對象,並將其字體設爲宋體,大小設爲12,而且加粗

再利用單元格的QTableWidgetItem類中的setFont加載給特定的單元格。若是須要對全部的單元格都使用這種字體,則可使用

self.MyTable.setFont(testFont)  #利用QTableWidget類中的setFont成員函數,將全部的單元格都設成該字體

 

 

3.設置單元格內文字的對齊方式:

這個比較簡單,使用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 的方式便可

 

4.合併單元格效果的實現:

self.MyTable.setSpan(0, 0, 3, 1)  # 其參數爲: 要改變單元格的   1行數  2列數     要合併的  3行數  4列數

 

 

5.設置單元格的大小

首先,能夠指定某個行或者列的大小

self.MyTable.setColumnWidth(2,50)  #將第2列的單元格,設置成50寬度

self.MyTable.setRowHeight(2,60)      #將第2行的單元格,設置成60的高度

 

還能夠將行和列的大小設爲與內容相匹配

self.MyTable.resizeColumnsToContents()   #將列調整到跟內容大小相匹配 self.MyTable.resizeRowsToContents()      #將行大小調整到跟內容的大學相匹配

 

6.得到單擊單元格的內容

經過實現 itemClicked (QTableWidgetItem *) 信號的槽函數,就能夠得到鼠標單擊到的單元格指針,進而得到其中的文字信息

首先在__init()__函數中加入

self.connect(self.MyTable, SIGNAL("itemClicked (QTableWidgetItem*)"), self.outSelect)  #將itemClicked信號與函數outSelect綁定

 

而後實現一個outSelect函數,以下:

    def outSelect(self, Item=None):         if Item==None:             return                print(Item.text())

運行程序後,單擊一個單元格,便可得到其中的字符了

 

轉自:http://blog.csdn.net/vah101/article/details/6215066

相關文章
相關標籤/搜索