QTableWidget是PyQt中用于显示和编辑表格数据的控件,它是QTableView的子类,提供了更简单的接口来处理表格数据。与QTableView不同,QTableWidget已经内置了数据模型(QTableWidgetItem),适合处理小型到中型的表格数据。
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
class TableDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QTableWidget示例')
self.resize(400, 300)
# 创建表格控件
self.table = QTableWidget()
self.table.setRowCount(5) # 设置行数
self.table.setColumnCount(3) # 设置列数
# 设置表头
self.table.setHorizontalHeaderLabels(['姓名', '年龄', '职业'])
# 填充数据
data = [
('张三', '25', '工程师'),
('李四', '30', '设计师'),
('王五', '28', '产品经理'),
('赵六', '35', '架构师'),
('钱七', '27', '测试工程师')
]
for row, (name, age, job) in enumerate(data):
self.table.setItem(row, 0, QTableWidgetItem(name))
self.table.setItem(row, 1, QTableWidgetItem(age))
self.table.setItem(row, 2, QTableWidgetItem(job))
# 布局
layout = QVBoxLayout()
layout.addWidget(self.table)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication([])
demo = TableDemo()
demo.show()
app.exec_()
item = QTableWidgetItem("内容")
item.setTextAlignment(Qt.AlignCenter) # 设置对齐方式
table.setItem(row, column, item)
item = table.item(row, column)
if item:
content = item.text()
# 水平表头
table.setHorizontalHeaderLabels(['列1', '列2', '列3'])
# 垂直表头
table.setVerticalHeaderLabels(['行1', '行2', '行3'])
item = QTableWidgetItem("特殊内容")
item.setBackground(QColor(255, 0, 0)) # 背景色
item.setForeground(QColor(255, 255, 255)) # 前景色(文字颜色)
item.setFont(QFont("Arial", 12, QFont.Bold)) # 字体
table.setItem(row, column, item)
table.setSpan(row, column, rowSpan, columnSpan)
table.setSortingEnabled(True) # 启用排序
table.sortItems(column, Qt.AscendingOrder) # 按指定列排序
from PyQt5.QtWidgets import QComboBox
combo = QComboBox()
combo.addItems(['选项1', '选项2', '选项3'])
table.setCellWidget(row, column, combo)
class IntTableItem(QTableWidgetItem):
def __init__(self, text=""):
super().__init__(text)
def setData(self, role, value):
if role == Qt.EditRole:
try:
int(value)
except ValueError:
return
super().setData(role, value)
# 使用
item = IntTableItem("10")
table.setItem(row, column, item)
from PyQt5.QtWidgets import QMenu
class TableDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# ... 其他初始化代码 ...
self.table.setContextMenuPolicy(Qt.CustomContextMenu)
self.table.customContextMenuRequested.connect(self.showContextMenu)
def showContextMenu(self, pos):
menu = QMenu()
copy_action = menu.addAction("复制")
paste_action = menu.addAction("粘贴")
delete_action = menu.addAction("删除")
action = menu.exec_(self.table.viewport().mapToGlobal(pos))
if action == copy_action:
self.copyCell()
elif action == paste_action:
self.pasteCell()
elif action == delete_action:
self.deleteCell()
def copyCell(self):
# 实现复制逻辑
pass
def pasteCell(self):
# 实现粘贴逻辑
pass
def deleteCell(self):
# 实现删除逻辑
pass
问题描述:当数据量很大时,QTableWidget性能下降明显。
解决方案:
问题原因:
解决方案:
问题原因:
解决方案:
问题原因:
解决方案:
item.setFlags(item.flags() | Qt.ItemIsEditable) # 启用编辑
# 或
item.setFlags(item.flags() & ~Qt.ItemIsEditable) # 禁用编辑
没有搜到相关的文章