QTableWidget是Qt中常用顯示數據的表格,類似其他語言中的DataGrid; QTableWidget是QtableView的子類;每個單元格下是一個QTableWidgetItem對象;
常用方法如下:
表格編輯類型的枚舉常量:
單元格選中相關枚舉類型:
單元格內容對齊方式枚舉類型:
例如:
1 #QTableWidget 控件使用 2 from PyQt5.QtWidgets import QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar, QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout, QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel 3 from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor 4 from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt 5 import sys 6 7 class WindowClass(QWidget): 8 9 def __init__(self,parent=None): 10 11 super(WindowClass, self).__init__(parent) 12 self.layout=QHBoxLayout() 13 self.resize(400,300) 14 tableWidget=QTableWidget() 15 tableWidget.setRowCount(4)#行數 16 tableWidget.setColumnCount(4)#列數 17 tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自動拉伸,充滿界面 18 tableWidget.setSelectionMode(QAbstractItemView.SingleSelection) # 設置只能選中一行 19 tableWidget.setEditTriggers(QTableView.NoEditTriggers) # 不可編輯 20 tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows); # 設置只有行選中 21 22 self.layout.addWidget(tableWidget) 23 tableWidget.setHorizontalHeaderLabels(['姓名','地址','年齡','工資']) #橫向標題排列,如果使用setVerticalHeaderLabels則是縱向排列標題 24 items=[['JONES','Beijing','23',2300],['SMITH','SHAngHai','23','3000'],['ZY','Tianjin','23','2000'],['Smith','SJT','22','1030']] 25 for i in range(len(items)):#注意上面列表中數字加單引號,否則下面不顯示(或者下面str方法轉化一下即可) 26 item=items[i] 27 for j in range(len(item)): 28 item = QTableWidgetItem(str(items[i][j])) 29 tableWidget.setItem(i,j,item) 30 self.setLayout(self.layout) 31 32 if __name__=="__main__": 33 app=QApplication(sys.argv) 34 win=WindowClass() 35 win.show() 36 sys.exit(app.exec_())
以上部分方法是之間使用QTableView組件時使用過的;請注意;
其他設置:
1 tableWidget.horizontalHeader().setVisible(False)#設置列標題隱藏(針對列標題橫向排列) 2 #tableWidget.verticalHeader().setVisible(False)#設置列標題隱藏(針對列標題縱向排列)
修改上面程序,項單元格中添加控件:
1 #QTableWidget 控件使用 2 from PyQt5.QtWidgets import QComboBox,QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar, QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout, QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel 3 from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor,QFont,QBrush,QColor 4 from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt 5 6 import sys 7 8 9 class WindowClass(QWidget): 10 11 def __init__(self,parent=None): 12 13 super(WindowClass, self).__init__(parent) 14 self.layout=QHBoxLayout() 15 self.resize(400,300) 16 tableWidget=QTableWidget() 17 tableWidget.setRowCount(4)#行數 18 tableWidget.setColumnCount(4)#列數 19 tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自動拉伸,充滿界面 20 tableWidget.setSelectionMode(QAbstractItemView.SingleSelection) # 設置只能選中一行 21 tableWidget.setEditTriggers(QTableView.NoEditTriggers) # 不可編輯 22 tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows); # 設置只有行選中, 整行選中 23 tableWidget.resizeColumnsToContents()#設置列寬高按照內容自適應 24 tableWidget.resizeRowsToContents()#設置行寬和高按照內容自適應 25 #tableWidget.horizontalHeader().setVisible(False)#設置列標題隱藏(針對列標題橫向排列) 26 #tableWidget.verticalHeader().setVisible(False)#設置列標題隱藏(針對列標題縱向排列) 27 self.layout.addWidget(tableWidget) 28 tableWidget.setHorizontalHeaderLabels(['姓名','地址','年齡','操作']) #橫向標題排列,如果使用setVerticalHeaderLabels則是縱向排列標題 29 items=[['JONES','Beijing','23',''],['SMITH','SHAngHai','23',''],['ZY','Tianjin','23',''],['Smith','SJT','22','']] 30 for i in range(len(items)):#注意上面列表中數字加單引號,否則下面不顯示(或者下面str方法轉化一下即可) 31 item=items[i] 32 33 for j in range(len(item)): 34 #-----------------------------修改后程序,最后一列添加按鈕-------------------# 35 if j!=3: 36 item = QTableWidgetItem(str(items[i][j])) 37 tableWidget.setItem(i, j, item) 38 else: #最后一列添加控件 39 btn = QPushButton("刪除") 40 btn.setDown(True) 41 btn.setStyleSheet("QPushButton{margin:3px};") 42 tableWidget.setCellWidget(i, j, btn) 43 #--------------------------------------------------------------------------# 44 45 #------------------------------0,1位置添加下拉列表框----------------------# 46 #某個單元格設置為控件 47 comBox=QComboBox() 48 comBox.addItem("北京") 49 comBox.addItems(["上海","天津"]) 50 comBox.setStyleSheet("QComboBox{margin:3px};") 51 tableWidget.setCellWidget(0,1,comBox) 52 #------------------------------------------------------------------------# 53 #字體設置 54 newItem=tableWidget.item(0,0) 55 newItem.setFont(QFont("Times",12,QFont.Black))#字體樣式加粗 56 newItem.setForeground(QBrush(QColor(255,0,0)))#字體顏色 57 #設置排序 58 tableWidget.sortItems(1,Qt.AscendingOrder)#Qt.DescendingOrder 升序降序 59 item_00=tableWidget.item(0,0) 60 item_00.setTextAlignment(Qt.AlignRight)#Qt.AlignCenter ... 61 #合並單元格 62 tableWidget.setSpan(0,0,3,1) 63 #單元格寬高設置 64 tableWidget.setColumnWidth(0,150)#第一個參數為行下標 65 tableWidget.setRowHeight(0,40) 66 #設置不顯示分割線 67 tableWidget.setShowGrid(False) 68 69 #單元格設置圖片 70 tableWidget.setItem(1,1,QTableWidgetItem(QIcon("./image/add.ico"),"百度")) 71 72 tableWidget.setItem(0,0,newItem) 73 74 self.setLayout(self.layout) 75 76 if __name__=="__main__": 77 app=QApplication(sys.argv) 78 win=WindowClass() 79 win.show() 80 sys.exit(app.exec_())
設置單元格圖片:
1 #QTableWidget 控件使用 2 from PyQt5.QtWidgets import QComboBox,QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar, QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout, QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel 3 from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor,QFont,QBrush,QColor 4 from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt 5 6 import sys 7 class WindowClass(QWidget): 8 9 def __init__(self,parent=None): 10 11 super(WindowClass, self).__init__(parent) 12 self.layout=QHBoxLayout() 13 self.resize(400,300) 14 tableWidget=QTableWidget() 15 tableWidget.setRowCount(10)#行數 16 tableWidget.setColumnCount(10)#列數 17 tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自動拉伸,充滿界面 18 tableWidget.setSelectionMode(QAbstractItemView.SingleSelection) # 設置只能選中一行 19 tableWidget.setEditTriggers(QTableView.NoEditTriggers) # 不可編輯 20 tableWidget.setSelectionBehavior(QAbstractItemView.SelectItems); # 設置只能選中單元格 21 tableWidget.resizeColumnsToContents()#設置列寬高按照內容自適應 22 tableWidget.resizeRowsToContents()#設置行寬和高按照內容自適應 23 #tableWidget.setHorizontalHeaderLabels(['','','','','','','','','','']) 24 25 for i in range(10): 26 tableWidget.setColumnWidth(i,20) 27 for i in range(10): 28 tableWidget.setRowHeight(i,20) 29 for k in range(10): 30 for m in range(10): 31 item=QTableWidgetItem() 32 item.setFlags(Qt.ItemIsEnabled)#點擊圖片選中單元格 33 icon=QIcon('./image/7.ico') 34 item.setIcon(icon) 35 36 tableWidget.setItem(k,m,item) 37 tableWidget.itemClicked.connect(self.getItemsText) 38 self.layout.addWidget(tableWidget) 39 self.setLayout(self.layout) 40 def getItemsText(self,item): 41 print("獲取內容:",item)#item.icon()) 42 43 if __name__=="__main__": 44 app=QApplication(sys.argv) 45 win=WindowClass() 46 win.show() 47 sys.exit(app.exec_())