PyQt5高階介面控制元件之QTableWidget的具體使用方法
前言
QTableWidget是Qt程式中常用的顯示資料表格的控制元件,類似於c#中的DataGrid。QTableWidget是QTableView的子類,它使用標準的資料模型,並且其單元資料是通過QTableWidgetItem物件來實現的,使用QTableWidget時就需要QTableWidgetItem。用來表示表格中的一個單元格,整個表格就是用各個單元格構建起來的
QTableWidget類中的常用方法
方法 | 描述 |
---|---|
setROwCount(int row) | 設定QTableWidget表格控制元件的行數 |
setColumnCount(int col) | 設定QTableWidget表格控制元件的列數 |
setHorizontalHeaderLabels() | 設定QTableWidget表格控制元件的水平標籤 |
setVerticalHeaderLabels() | 設定QTableWidget表格控制元件的垂直標籤 |
setItem(int,int,QTableWidgetItem) | 在QTableWidget表格控制元件的每個選項的單元控制元件內新增控制元件 |
horizontalHeader() | 獲得QTableWidget表格控制元件的表格頭,以便執行隱藏 |
rowCount() | 獲得QTableWidget表格控制元件的行數 |
columnCount() | 獲得QTableWidget表格控制元件的列數 |
setEditTriggers(EditTriggers triggers) | 設定表格是否可以編輯,設定表格的列舉值 |
setSelectionBehavior | 設定表格的選擇行為 |
setTextAlignment() | 設定單元格內文字的對齊方式 |
setSpan(int row,int column,int rowSpanCount,int columnSpanCount) | 合併單元格,要改變單元格的第row行,column列,要合併rowSpancount行數和columnSpanCount列數 |
row:要改變的行數 | |
column:要改變的列數 | |
rowSpanCount:需要合併的行數 | |
columnSpanCount:需要合併的列數 | |
setShowGrid() | 在預設情況下表格的顯示是有網格的,可以設定True或False用於是否顯示,預設True |
setColumnWidth(int column,int width) | 設定單元格行的寬度 |
setRowHeight(int row,int height) | 設定單元格列的高度 |
編輯規則的列舉值型別
選項 | 值 | 描述 |
---|---|---|
QAbstractItemView.NoEditTriggers0No | 0 | 不能對錶格內容進行修改 |
QAbstractItemView.CurrentChanged1Editing | 1 | 任何時候都能對單元格進行修改 |
QAbstractItemView.DoubleClicked2Editing | 2 | 雙擊單元格 |
QAbstractItemView.SelectedClicked4Editing | 4 | 單擊已經選中的內容 |
QAbstractItemView.EditKeyPressed8Editing | 8 | 當修改鍵按下時修改單元格 |
QAbstractItemView.AnyKeyPressed16Editing | 16 | 按任意鍵修改單元格 |
QAbstractItemView.AllEditTriggers31Editing | 31 | 包括以上所有條件 |
表格選擇行為的列舉值
選擇 | 值 | 描述 |
---|---|---|
QAbstractItemView.SelectItems0Selecting | 0 | 選中單個單元格 |
QAbstractItemView.SelectRows1Selecting | 1 | 選中一行 |
QAbstractItemView.SelectColumns2Selecting | 2 | 選中一列 |
單元格文字水平對齊方式
選項 | 描述 |
---|---|
Qt.AlignLeft | 將單元格內的內容沿單元格的左邊緣對齊 |
Qt.AlignRight | 將單元格內的內容沿單元格的右邊緣對齊 |
Qt.AlignHCenter | 在可用空間中,居中顯示在水平方向上 |
Qt.AlignJustify | 將文字在可用空間內對齊,預設從左到右 |
單元格文字垂直對齊方式
選項 | 描述 |
---|---|
Qt.AlignTop | 與頂部對齊 |
Qt.AlignBottom | 與底部對齊 |
Qt.AlignVCenter | 在可用空間中,居中顯示在垂直方向上 |
Qt.AlignBaseline | 與基線對齊 |
如果要設定水平和垂直方向對齊方式,比如在表格空間內上下,左右居中對齊,那麼只要使用Qt,AlignHCenter和Qt,AlignVCenter即可
例項:QTableWidget的基本用法
import sys from PyQt5.QtWidgets import * class Table(QWidget): def __init__(self): super(Table,self).__init__() self.initUI() def initUI(self): self.setWindowTitle("QTableWidget例子") self.resize(400,300) layout=QHBoxLayout() #實現的效果是一樣的,四行三列,所以要靈活運用函式,這裡只是示範一下如何單獨設定行列 TableWidget=QTableWidget(4,3) # TableWidget = QTableWidget() # TableWidget.setRowCount(4) # TableWidget.setColumnCount(3) #設定水平方向的表頭標籤與垂直方向上的表頭標籤,注意必須在初始化行列之後進行,否則,沒有效果 TableWidget.setHorizontalHeaderLabels(['姓名','性別','體重(kg)']) #Todo 優化1 設定垂直方向的表頭標籤 #TableWidget.setVerticalHeaderLabels(['行1','行2','行3','行4']) #TODO 優化 2 設定水平方向表格為自適應的伸縮模式 ##TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) #TODO 優化3 將表格變為禁止編輯 #TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) #TODO 優化 4 設定表格整行選中 #TableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) #TODO 優化 5 將行與列的高度設定為所顯示的內容的寬度高度匹配 #QTableWidget.resizeColumnsToContents(TableWidget) #QTableWidget.resizeRowsToContents(TableWidget) #TODO 優化 6 表格頭的顯示與隱藏 #TableWidget.verticalHeader().setVisible(False) #TableWidget.horizontalHeader().setVisible(False) #TOdo 優化7 在單元格內放置控制元件 # comBox=QComboBox() # comBox.addItems(['男','女']) # comBox.addItem('未知') # comBox.setStyleSheet('QComboBox{margin:3px}') # TableWidget.setCellWidget(0,1,comBox) # # searchBtn=QPushButton('修改') # searchBtn.setDown(True) # searchBtn.setStyleSheet('QPushButton{margin:3px}') # TableWidget.setCellWidget(0,2,searchBtn) #新增資料 newItem=QTableWidgetItem('張三') TableWidget.setItem(0,newItem) newItem=QTableWidgetItem('男') TableWidget.setItem(0,newItem) newItem=QTableWidgetItem('160') TableWidget.setItem(0,newItem) layout.addWidget(TableWidget) self.setLayout(layout) if __name__ == '__main__': app=QApplication(sys.argv) win=Table() win.show() sys.exit(app.exec_())
初始執行程式,顯示效果如下
程式碼分析
構造一個QTableWidget物件,設定表格為4行3列
TableWidget=QTableWidget(4,3)
設定表格頭
TableWidget.setHorizontalHeaderLabels(['姓名','體重(kg)'])
生成一個QTableWidgetItem物件,並新增到表格的0行0列處
newItem=QTableWidgetItem('張三') TableWidget.setItem(0,newItem)
優化1:設定垂直方向表格頭標籤
TableWidget.setVerticalHeaderLabels(['行1','行4'])
效果如下
優化2:設定表格頭為伸縮模式
使用QTableWidget物件的horizontalHeader()函式,設定表格為自適應的伸縮模式,即可根據視窗的大小來改變網格的大小
TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
優化3:將表格設定為禁止編輯
在預設情況下,表格中的字元是可以更改的,比如雙擊一個單元格,就可以修改原來的內容,如果想禁止這種操作,讓表格對使用者只是只讀,則可以編輯一下程式碼
TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
優化4:表格整行選中
表格預設選擇的是單個單元格,通過以下程式碼可以設定整行選中
TableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
優化5:將行與列的寬度高度與文字內容的寬高相匹配
QTableWidget.resizeColumnsToContents(TableWidget) QTableWidget.resizeRowsToContents(TableWidget)
優化6:表格頭的顯示與隱藏
TableWidget.verticalHeader().setVisible(False) TableWidget.horizontalHeader().setVisible(False)
優化7:在單元格內放置控制元件
QTableWidget不僅允許往單元格內放置文字,還允許放置控制元件,通過QTableWidget.setItem()來新增PyQt的基本控制元件
這裡把一個下拉列表框和一個按鈕加入單元格中,設定控制元件與單元格的邊距,如為3px畫素,程式碼如下
comBox=QComboBox() comBox.addItems(['男','女']) comBox.addItem('未知') comBox.setStyleSheet('QComboBox{margin:3px}') TableWidget.setCellWidget(0,comBox) searchBtn=QPushButton('修改') searchBtn.setDown(True) searchBtn.setStyleSheet('QPushButton{margin:3px}') TableWidget.setCellWidget(0,searchBtn)
例項二:在表格中快速定位到指定行
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class Table(QWidget): def __init__(self): super(Table,self).__init__() self.initUI() def initUI(self): #設定標題與初始大小 self.setWindowTitle('QTableWidget例子') self.resize(600,800) ##水平佈局 layout=QHBoxLayout() #例項化表格檢視(30*4) tablewidget=QTableWidget(30,4) layout.addWidget(tablewidget) for i in range(30): for j in range(4): itemContent='(%d,%d)'%(i,j) #為每個表格內新增資料 tablewidget.setItem(i,j,QTableWidgetItem(itemContent)) self.setLayout(layout) #遍歷表格查詢對應項 text='(10,1)' items=tablewidget.findItems(text,Qt.MatchExactly) item=items[0] #選中單元格 item.setSelected(True) #設定單元格的背脊顏色為紅 item.setForeground(QBrush(QColor(255,0))) row=item.row() #通過滑鼠滾輪定位,快速定位到第十一行 tablewidget.verticalScrollBar().setSliderPosition(row) if __name__ == '__main__': app=QApplication(sys.argv) table=Table() table.show() sys.exit(app.exec_())
效果如圖
例項三:QTableWidget的高階用法
import sys from PyQt5.QtWidgets import (QWidget,QTableWidget,QHBoxLayout,QApplication,QTableWidgetItem) from PyQt5.QtGui import QBrush,QColor,QFont from PyQt5.QtCore import Qt class Table(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #設定標題與初始大小 self.setWindowTitle("QTableWidget 例子") self.resize(430,230) #水平佈局,初始表格為(4*3),新增到佈局中 conLayout = QHBoxLayout() tableWidget = QTableWidget(5,3) conLayout.addWidget(tableWidget) #設定水平頭標籤 tableWidget.setHorizontalHeaderLabels(['姓名','體重(kg)']) #建立新條目,設定背景顏色,新增到表格指定行列中 newItem = QTableWidgetItem("張三") #newItem.setForeground(QBrush(QColor(255,0))) tableWidget.setItem(0,newItem) # 建立新條目,設定背景顏色,新增到表格指定行列中 newItem = QTableWidgetItem("男") #newItem.setForeground(QBrush(QColor(255,newItem) # 建立新條目,設定背景顏色,新增到表格指定行列中 newItem = QTableWidgetItem("160") #newItem.setForeground(QBrush(QColor(255,newItem) # newItem = QTableWidgetItem("李四") # #將字型加粗,黑色字型 # newItem.setFont(QFont('Times',12,QFont.Black)) # tableWidget.setItem(1,newItem) # # # 建立新條目,設定背景顏色,新增到表格指定行列中 # newItem = QTableWidgetItem("男") # newItem.setFont(QFont('Times',newItem) # # # 建立新條目,設定背景顏色,新增到表格指定行列中 # newItem = QTableWidgetItem("150") # newItem.setFont(QFont('Times',newItem) # # newItem = QTableWidgetItem("王五") # #將字型加粗,黑色字型 # newItem.setFont(QFont('Times',QFont.Black)) # tableWidget.setItem(2,newItem) # # # 建立新條目,設定背景顏色,新增到表格指定行列中 # newItem = QTableWidgetItem("女") # newItem.setFont(QFont('Times',newItem) # # # 建立新條目,設定背景顏色,新增到表格指定行列中 # newItem = QTableWidgetItem("175") # newItem.setFont(QFont('Times',QFont.Black)) # 設定單元格文字的對齊方式 #newItem.setTextAlignment(Qt.AlignRight|Qt.AlignBottom) #tableWidget.setItem(2,newItem) #按照體重排序 #Qt.DescendingOrder降序 #Qt.AscEndingOrder升序 #tableWidget.sortItems(2,Qt.DescendingOrder) #合併單元格 #tableWidget.setSpan(2,4,1) #設定單元格的大小 #將第一列的單元寬度設定為150 #tableWidget.setColumnWidth(0,150) #將第一行的單元格高度的設定為120 #tableWidget.setRowHeight(0,120) #表格中不顯示分割線 #tableWidget.setShowGrid(False) #隱藏垂直頭標籤 #tableWidget.verticalHeader().setVisible(False) self.setLayout(conLayout) if __name__ == '__main__': app = QApplication(sys.argv) example = Table() example.show() sys.exit(app.exec_())
初始執行,效果如下
優化1:設定單元格的文字顏色,將第一行中的三個文字顏色設定為紅色
newItem.setForeground(QBrush(QColor(255,0)))
優化2:將字型加粗
#設定字型型別,大小號,顏色 newItem.setFont(QFont('Times',QFont.Black))
優化3:設定單元格的排序方式
from PyQt5.QtCore import Qt #按照體重排序 #Qt.DescendingOrder降序 #Qt.AscEndingOrder升序 tableWidget.sortItems(2,Qt.DescendingOrder)
優化4:單元格的文字對齊方式
這裡更改了王五體重的文字對齊方式為右下角處
# 設定單元格文字的對齊方式(右下) newItem.setTextAlignment(Qt.AlignRight|Qt.AlignBottom) tableWidget.setItem(2,newItem)
優化5:合併單元格
將表格中第一行第一列的單元格,更改為佔據5行1列
#合併單元格 tableWidget.setSpan(2,5,1)
優化6:設定單元格的大小
這裡將第一行寬度設定為150,高度設定為120
#將第一列的單元寬度設定為150 tableWidget.setColumnWidth(0,150) #將第一行的單元格高度的設定為120 tableWidget.setRowHeight(0,120)
優化7:在表格中不顯示分割線
QTableWidget類的setShowGrid()函式是從QTableView類繼承的,用來設定是否顯示錶格的分割線,預設顯示分割線
#表格中不顯示分割線 tableWidget.setShowGrid(False)
優化8:為單元格新增圖片
還可以在單元格內新增圖片並顯示圖片描述資訊,程式碼如下
這裡圖片放置在王五體重的單元格內
#新增圖片 newItem = QTableWidgetItem(QIcon("./images/bao1.png"),"揹包") tableWidget.setItem(2,newItem)
例項四:單元格內圖片的顯示
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class Table(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #設定標題與初始大小 self.setWindowTitle("QTableWidget 例子") self.resize(1000,900); #設定佈局,初始表格5*3 conLayout = QHBoxLayout() table= QTableWidget(5,3) #設定表格水平頭標籤 table.setHorizontalHeaderLabels(['圖片1','圖片2','圖片3']) #設定不可編輯模式 table.setEditTriggers( QAbstractItemView.NoEditTriggers) #設定圖片的大小 table.setIconSize(QSize(300,200)) #設定所有行列寬高數值與圖片大小相同 for i in range(3): # 讓列寬和圖片相同 table.setColumnWidth(i,300) for i in range(5): # 讓行高和圖片相同 table.setRowHeight(i,200) for k in range(15): i = k/ 3 j = k % 3 #例項化表格視窗條目 item = QTableWidgetItem() #使用者點選表格時,圖片被選中 item.setFlags(Qt.ItemIsEnabled) #圖片路徑設定與圖片載入 icon = QIcon(r'.\images\bao%d.png' % k) item.setIcon(QIcon(icon)) #輸出當前進行的條目序號 print('e/icons/%d.png i=%d j=%d' % (k,i,j)) #將條目載入到相應行列中 table.setItem(i,item) conLayout.addWidget(table) self.setLayout(conLayout) if __name__ == '__main__': app = QApplication(sys.argv) example = Table() example.show() sys.exit(app.exec_())
效果如下
例項五:支援右鍵選單
import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class Table(QWidget): def __init__(self): super(Table,self).__init__() self.initUI() def initUI(self): # 設定標題與初始大小 self.setWindowTitle('QTableWidget demo') self.resize(500,300) # 水平佈局,初始表格5*3,新增到佈局 layout = QHBoxLayout() self.tableWidget = QTableWidget(5,3) layout.addWidget(self.tableWidget) # 設定表格水平方向的頭標籤 self.tableWidget.setHorizontalHeaderLabels([ '姓名','體重' ]) # 設定水平方向自動伸縮填滿視窗 self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 新增資料到指定行列 newItem = QTableWidgetItem("張三") self.tableWidget.setItem(0,newItem) newItem = QTableWidgetItem("男") self.tableWidget.setItem(0,newItem) newItem = QTableWidgetItem("160") self.tableWidget.setItem(0,newItem) newItem = QTableWidgetItem("李四") self.tableWidget.setItem(1,newItem) newItem = QTableWidgetItem("女") self.tableWidget.setItem(1,newItem) newItem = QTableWidgetItem("120") self.tableWidget.setItem(1,newItem) # 允許右鍵產生選單 self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu) # 將右鍵選單繫結到槽函式generateMenu self.tableWidget.customContextMenuRequested.connect(self.generateMenu) self.setLayout(layout) def generateMenu(self,pos): # 計算有多少條資料,預設-1,row_num = -1 for i in self.tableWidget.selectionModel().selection().indexes(): row_num = i.row() # 表格中只有兩條有效資料,所以只在前兩行支援右鍵彈出選單 if row_num < 2: menu = QMenu() item1 = menu.addAction(u'選項一') item2 = menu.addAction(u'選項二') item3 = menu.addAction(u'選項三') action = menu.exec_(self.tableWidget.mapToGlobal(pos)) # 顯示選中行的資料文字 if action == item1: print('你選了選項一,當前行文字內容是:',self.tableWidget.item(row_num,0).text(),1).text(),2).text()) if action == item2: print('你選了選項二,當前行文字內容是:',2).text()) if action == item3: print('你選了選項三,當前行文字內容是:',2).text()) if __name__ == '__main__': app = QApplication(sys.argv) example = Table() example.show() sys.exit(app.exec_())
相關檔案及下載地址:PyQt5_jb51.zip
到此這篇關於PyQt5高階介面控制元件之QTableWidget的具體使用方法的文章就介紹到這了,更多相關PyQt5 QTableWidget內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!