1 官方帮助文档
Mode/view
QTableView Qt5.15帮助文档
QStandardItemModel
QStandardItem
2 基本使用
#!/usr/bin/env python3
# -*- coding:GBK -*-
# Author: zero
import os,sys,re
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush,QStandardItemModel,QStandardItem
class QTableViewDemo(QWidget):
def __init__(self):
super(QTableViewDemo, self).__init__()
self.setWindowTitle("QTableViewDemo")
self.resize( 600,500 )
self.mainlayout = QVBoxLayout(self)
#创建表格行列
self.tableview = QTableView(self)
#设置表格不可编辑
self.tableview.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.mainlayout.addWidget(self.tableview)
# 常规基本使用 3行 4列
mode = QStandardItemModel(self)
row ,col = 3, 4
mode.setRowCount(row)
mode.setColumnCount(col)
#设置表头
#mode.setHorizontalHeaderLabels(["第一列","第二列","第三列","第4列"])
#mode.setVerticalHeaderLabels(["第1行","第2行","第3行"])
for i in range(col):
mode.setHeaderData(i, Qt.Horizontal, "第%d列"%(i+1) )
for i in range(row):
mode.setHeaderData(i, Qt.Vertical, "第%d行"%(i+1) )
#隐藏垂直表头
#设置item
for row in range(3):
for col in range(4):
item = QStandardItem("第%d行 %d列"%(row+1,col+1)) # 0开始
mode.setItem(row,col,item)
self.tableview.setModel(mode)
if __name__ == "__main__":
app = QApplication(sys.argv)
test = QTableViewDemo()
test.show()
sys.exit(app.exec_())
如下所示:
3 自定义mode使用
#!/usr/bin/env python3
# -*- coding:GBK -*-
# Author: zero
import os, sys, re
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt,QAbstractTableModel,QModelIndex
from PyQt5.QtGui import QBrush, QStandardItemModel, QStandardItem,QColor
class MyQTableViewMode(QAbstractTableModel):
def __init__(self):
super(MyQTableViewMode, self).__init__()
self.h_heads = ["姓名","年龄","薪资","备注"]
self.names, self.ages, self.salary,self.remarks = [],[],[],[]
self.names.extend(["张三","李四","小王","小明"])
self.ages.extend([18, 19, 20, 21])
self.salary.extend([1000, 2000, 4000, 8000])
print( self.names,len(self.names))
def rowCount(self, parent: QModelIndex) -> int:
return 4
def columnCount(self, parent: QModelIndex) -> int:
return 4
def data(self, index: QModelIndex, role):
if not index.isValid():
return None
if role == Qt.DisplayRole:
match index.column():
case 0:
return self.names[index.row()]
case 1:
return str(self.ages[index.row()])
case 2:
return str(self.salary[index.row()])
case _:
pass
#print(index.column())
elif role == Qt.TextAlignmentRole: #对齐方式
if 0 == index.column():
return Qt.AlignCenter
elif 1 == index.column():
return Qt.AlignCenter
elif 2 == index.column():
return Qt.AlignRight|Qt.AlignVCenter
elif role == Qt.BackgroundRole: #背景色
if 0 == index.column():
return QColor(255,0,0)
elif 1 == index.column():
return QColor(0,200,0)
elif role == Qt.ForegroundRole: #字体颜色
if 2 == index.column():
return QColor(100,100,220)
elif role == Qt.CheckStateRole: #选择框
if 3 == index.column():
return False
return None
def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...):
if role == Qt.DisplayRole and orientation == Qt.Horizontal:
return self.h_heads[section]
class QTableViewDemo(QWidget):
def __init__(self):
super(QTableViewDemo, self).__init__()
self.setWindowTitle("QTableViewDemo")
self.resize(600, 500)
self.mainlayout = QVBoxLayout(self)
# 创建表格行列
self.tableview = QTableView(self)
# 设置表格不可编辑
self.tableview.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.mainlayout.addWidget(self.tableview)
# 常规基本使用 3行 4列
mode = MyQTableViewMode()
self.tableview.setModel(mode)
if __name__ == "__main__":
app = QApplication(sys.argv)
test = QTableViewDemo()
test.show()
sys.exit(app.exec_())
效果: