QTableWidget表格继承自QTableView, 比QTableView增加了一些方法,使用更方便,主要有如下API:
setRowCount: 设置行数
setColumnCount:设置列数
setHorizontalHeaderLabels:设置表头
setEditTriggers:禁止编辑,读写属性设置
setSelectionBehavior:整行选择设置
setShowGrid:网格线隐藏与否设置
一 创建表格
示例代码如下:
import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHeaderView, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView)
class TableWidgetDemo(QWidget):
def __init__(self):
super(TableWidgetDemo,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget演示")
self.resize(430, 230);
layout = QHBoxLayout()
tablewidget = QTableWidget()
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
tablewidget.setHorizontalHeaderLabels(['姓名','年龄','籍贯'])
nameItem1 = QTableWidgetItem("张飞")
tablewidget.setItem(0,0,nameItem1)
ageItem1 = QTableWidgetItem("24")
tablewidget.setItem(0,1,ageItem1)
jgItem1 = QTableWidgetItem("河北")
tablewidget.setItem(0,2,jgItem1)
nameItem2 = QTableWidgetItem("关羽")
tablewidget.setItem(1, 0, nameItem2)
ageItem2 = QTableWidgetItem("25")
tablewidget.setItem(1, 1, ageItem2)
jgItem2 = QTableWidgetItem("河南")
tablewidget.setItem(1, 2, jgItem2)
# 禁止编辑
tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
# 整行选择
tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)
# 调整列和行的大小
tablewidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
tablewidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
#设置水平竖直表头是否显示
# tablewidget.horizontalHeader().setVisible(False)
# tablewidget.verticalHeader().setVisible(False)
#设置竖直表头标题,五特殊要求可以不用设置
#tablewidget.setVerticalHeaderLabels(["a","b"])
# 隐藏表格线,False隐藏
tablewidget.setShowGrid(False)
layout.addWidget(tablewidget)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
example = TableWidgetDemo()
example.show()
sys.exit(app.exec_())
运行结果
二 查找表格数据
QTableWidget提供了数据查找的功能,例如,找到数据后改变数据项的颜色,如下图:
代码:
import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5.QtGui import QColor, QBrush
class FindDataLocation(QWidget):
def __init__(self):
super(FindDataLocation,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget查找数据")
self.resize(600, 800);
layout = QHBoxLayout()
tableWidget = QTableWidget()
tableWidget.setRowCount(40)
tableWidget.setColumnCount(4)
layout.addWidget(tableWidget)
for i in range(40):
for j in range(4):
itemContent = '(%d,%d)' %(i,j)
tableWidget.setItem(i,j,QTableWidgetItem(itemContent))
self.setLayout(layout)
# 搜索满足条件的Cell
text = '(11,3)'
items = tableWidget.findItems(text, QtCore.Qt.MatchExactly)
if len(items) > 0:
item = items[0]
item.setBackground(QBrush(QColor(0,255,0)))
item.setForeground(QBrush(QColor(255,0,0)))
row = item.row()
# 定位到指定的行
tableWidget.verticalScrollBar().setSliderPosition(row)
if __name__ == '__main__':
app = QApplication(sys.argv)
example = FindDataLocation()
example.show()
sys.exit(app.exec_())
代码说明:
1. 数据的定位:findItems 返回一个列表 2. 如果找到了满足条件的单元格,会定位到单元格所在的行:setSliderPosition(row)
除了上述的精确匹配外,也可以实现“以什么开头”,例如,以20开头的项
那么代码需要做如下修改
text = '(20,'
items = tableWidget.findItems(text, QtCore.Qt.MatchStartsWith)