PyQt5-高级控件使用(QTableWidget)
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_())