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_())
原文地址:https://www.cnblogs.com/ygzhaof/p/10078114.html