QTableWidget是QTableViewer的子類 ,其中QTableViewer可以使用自定義的數據模型來顯示內容(通過setModel
()來綁定數據源),而QTableWidget提供了一套標准的數據模型,QTableWidgetItem 對象作為QTableWidget中的單元數據來顯示。使用QTableWidget就依賴於QTableWidgetItem。QTableWidgetItem用來表示表格中的一個單元格,通過一個個單元格組成整體的表。
QTableWidget簡介:

如上圖是QTableWidget的顯示。
1. QTableWidgets實例化
根據QTableWidget的構造函數,我們在定義實例化的時候可以指定顯示的行數和列數,也可以在QTableWidget實例化之后通過成員函數進行設定:
self.table = QTableWidget(5,2) 或者 self.table = QTableWidget() self.table.setColumnCount(5) self.table.setRowCount(2)
2. 表頭操作:
在table表頭分為水平和垂直兩種,及horizontal header和vertical header兩類。
添加表頭:
可以添加水平和垂直表頭,QtWidgets提供兩個方法(setHorizontalHeaderLabels()和setVerticalHeaderLabels())來添加,如下為添加水平表頭。
horizontalHeader = ["工號","姓名","性別","年齡","職稱"] self.table = QTableWidget() self.table.setHorizontalHeaderLabels(horizontalHeader)
表頭的隱藏和顯示:
根據不同的應用場景可能需要對於表頭進行隱藏和顯示的操作,直接對表頭進行操作。
如下隱藏了垂直的表頭:
self.table = QTableWidget()
self.table.verticalHeader().setVisible(False)
表頭字體,顏色的設定:
由於表頭也是由多個item構成的,所以通過循環操作對每一個item進行操作。
self.table = QTableWidget() for index in range(self.table.columnCount()): headItem = self.table.horizontalHeaderItem(index) headItem.setFont(QFont("song", 12, QFont.Bold)) headItem.setForeground(QBrush(Qt.gray)) headItem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
3.表格設置
在表格的應用中,我們需要對表格的樣式,編輯模式,選擇行為進行設置。
編輯方式:
對於表格中的數據,默認只要雙擊就可以修改其中的數據。如果文檔是處於預覽狀態或者不可編輯狀態,那就需要對表格設定為不可編輯模式。
self.table = QTableWidget()
self.table.setEditTriggers(QTableWidget.NoEditTriggers)
對於表格的編輯的設定通過setEditTriggers()方法來實現。如下都是觸發修改單元格內容的條件:
QTableWidget.NoEditTriggers 0 No editing possible. 不能對表格內容進行修改 QTableWidget.CurrentChanged 1 Editing start whenever current item changes.任何時候都能對單元格修改 QTableWidget.DoubleClicked 2 Editing starts when an item is double clicked.雙擊單元格 QTableWidget.SelectedClicked 4 Editing starts when clicking on an already selected item.單擊已選中的內容 QTableWidget.EditKeyPressed 8 Editing starts when the platform edit key has been pressed over an item. QTableWidget.AnyKeyPressed 16 Editing starts when any key is pressed over an item.按下任意鍵就能修改 QTableWidget.AllEditTriggers 31 Editing starts for all above actions.以上條件全包括
單元格選擇:
比如我們在單擊某個單元格的時候,此時默認的行為是選中單元格,還是單元格所在的行或列,這個可以通過setSelectionBehavior()方法設定。如下為默認選中列:
self.table = QTableWidget() self.table.setSelectionBehavior(QTableWidget.SelectColumns) QTableWidget.SelectItems 0 Selecting single items.選中單個單元格 QTableWidget.SelectRows 1 Selecting only rows.選中一行 QTableWidget.SelectColumns 2 Selecting only columns.選中一列
行選擇方式:
比如我們需要同時選擇不相鄰的多個函數的時候,在excell中我們通過按shift然后點擊鼠標來選擇多行。在QtWidget也存在類似行為,我們可以通過setSelectionMode()方法來實現:
self.table = QTableWidget()
self.table.setSelectionMode(QTableWidget.SingleSelection )
可以設定的選擇模式:
QTableWidget.NoSelection 不能選擇
QTableWidget.SingleSelection 選中單個目標
QTableWidget.MultiSelection 選中多個目標
QTableWidget.ExtendedSelection shift鍵的連續選擇
QTableWidget.ContiguousSelection ctrl鍵的不連續的多個選擇
網格的顯示
通常默認的情況下需要顯示表格的網格線,在一些場景下不需要顯示網格線。則需要將對應的橫豎線進行隱藏:
self.table = QTableWidget()
self.table.setShowGrid(False)
setShowGrid(),False不顯示網格線,True顯示網格線
添加表項
由於整個表格是由一個個單元格組成,所以需要將單個的表格項添加到整個表格中。通過setItem()進行操作,如下為添加一個為str類型內容的表格:
self.table = QTableWidget() self.table.setItem(0,0, QTableWidgetItem("001")) setItem(int , int , QTableWidgetItem )
第1個參數 行號,從0開始
第2個參數 列號,從0開始
第3個參數 QTableWidgetItem對象。
表項添加自定義控件
比如在有些表項中需要QComboBox來實現下拉框的功能,比如性別選擇的時候就可以通過下拉框來實現選擇。
self.table = QTableWidget() genderComb = QComboBox() genderComb.addItem("男性") genderComb.addItem("女性") genderComb.setCurrentIndex(0) self.table.setCellWidget(0,2,genderComb)
實例化一個QComboBox對象,通過setCellWidget()將QComboBox添加到指定的單元格中。通過行號和列號唯一確定一個單元格。
setCellWidget(int int , QWidget )
第1個參數 行號,從0開始
第2個參數 列號,從0開始
第3個參數 QWidget 對象。
4.單元格操作
單元格對齊方式
在單元格中操作字符顯示的是否,常常需要操作各種對齊,比如水平的左對齊、右對齊、居中等,垂直的靠上、靠下對齊等方式。
headItem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
通過setTextAlignment()方法來設定,由於需要同時考慮水平和垂直方向,所以通過或‘|’的方式將兩個方向的對齊組合起來,如Qt.AlignLeft | Qt.AlignVCenter。
水平方向:
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.
垂直方向:
Qt.AlignTop 0x0020 Aligns with the top. Qt.AlignBottom 0x0040 Aligns with the bottom. Qt.AlignVCenter 0x0080 Centers vertically in the available space.
單元格大小設定
有時候需要根據顯示的要求來調整單元格的大小,行的寬度和列的高度。
self.table = QTableWidget() self.table.setColumnWidth(4,200) self.table.setRowHeight(0,40)
通過setColumnWidth()和setRowHeight()設定特定行或者列上的大小。
有時候需要根據顯示的內容自動調整單元格的大小,類似office中的內容相匹配。
self.table = QTableWidget()
self.table.resizeColumnsToContents()
self.table.resizeRowsToContents()
動態插入行列
當初始的行數或者列數不能滿足需要的時候,我們需要動態的調整表格的大小,如入動態的插入行:
self.table = QTableWidget() row_count = self.table.rowCount() self.table.insertRow(row_count)
本例中為插入到最后一行的后面。insertColumn()動態插入列。
insertRow(int)、insertColumn(int),指定位置插入行或者列
動態移除行列
removeColumn(int column) # 移除column列及其內容。 removeRow(int row) # 移除第row行及其內容。 self.table = QTableWidget() row_count = self.table.rowCount() self.table.removeRow(row_count-1)
本例中為移除最后一行。
其他操作
clear() 清除所有表項及表頭
setSpan(int , int , int , int ),合並單元格
代碼示例
#-*- coding:utf-8 -*- ''' TableWidget ''' __author__ = 'Tony Zhu' import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QTableWidget,QHBoxLayout, QTableWidgetItem, QComboBox,QFrame from PyQt5.QtGui import QFont,QColor,QBrush,QPixmap class TableSheet(QWidget): def __init__(self): super().__init__() self.initUi() def initUi(self): horizontalHeader = ["工號","姓名","性別","年齡","職稱"] self.setWindowTitle('TableWidget Usage') self.table = QTableWidget() self.table.setColumnCount(5) self.table.setRowCount(2) self.table.setHorizontalHeaderLabels(horizontalHeader) self.table.setEditTriggers(QTableWidget.NoEditTriggers) self.table.setSelectionBehavior(QTableWidget.SelectColumns) self.table.setSelectionMode(QTableWidget.SingleSelection ) for index in range(self.table.columnCount()): headItem = self.table.horizontalHeaderItem(index) headItem.setFont(QFont("song", 12, QFont.Bold)) headItem.setForeground(QBrush(Qt.gray)) headItem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.table.setColumnWidth(4,200) self.table.setRowHeight(0,40) #self.table.setFrameShape(QFrame.HLine)#設定樣式 #self.table.setShowGrid(False) #取消網格線 #self.table.verticalHeader().setVisible(False) #隱藏垂直表頭 self.table.setItem(0,0, QTableWidgetItem("001")) self.table.setItem(0,1,QTableWidgetItem("Tom")) genderComb = QComboBox() genderComb.addItem("男性") genderComb.addItem("女性") genderComb.setCurrentIndex(0) self.table.setCellWidget(0,2,genderComb) self.table.setItem(0,3,QTableWidgetItem("30")) self.table.setItem(0,4,QTableWidgetItem("產品經理")) self.table.setItem(1,0, QTableWidgetItem("005")) self.table.setItem(1,1,QTableWidgetItem("Kitty")) genderComb = QComboBox() genderComb.addItem("男性") genderComb.addItem("女性") genderComb.setCurrentIndex(1) self.table.setCellWidget(1,2,genderComb) self.table.setItem(1,3,QTableWidgetItem("24")) self.table.setItem(1,4,QTableWidgetItem("程序猿安慰師")) row_count = self.table.rowCount() self.table.insertRow(row_count) mainLayout = QHBoxLayout() mainLayout.addWidget(self.table) self.setLayout(mainLayout) if __name__ == '__main__': app = QApplication(sys.argv) table = TableSheet() table.show() sys.exit(app.exec_())
運行之后的效果如下:

