本篇介绍PyQt5中的QTableWidget,QTableWidget是一个表格控件。表格的第一行是行表头,第一列为列表头,除表头之外既是表格工作区。每一个单元格cell既是一个QTableWidgetItem对象。本篇Demo介绍QTableWidget对表格的操作。
新建一个窗口
窗口左面是表格的设置区域,中间区域是tableWidget控件,右侧是一个textBrowser,用来显示表格内的内容。
QTableWidget
- 定义一个枚举类型类,来表示每个单元格的类型。
class CellTyp(Enum):
ctName = 1000
ctSex = 1001
ctBirth = 1002
ctNation = 1003
ctAge = 1004
ctIsMarried = 1005
- 设置表头
- setColumnCount:设置列数。
- QTableWidgetItem:每一个cell就是一个QTableWidget对象,创建单元格。
- setFont:设置字体大小。
- setBackground:设置单元格背景颜色。
- setHosetrizontalHeaderItem:设置行表头。
def btnSetHeader_clicked(self):
headerList = ["姓名", "省份", "性别", "出生日期", "民族", "年龄", "是否已婚"]
self.tableWidget.setColumnCount(len(headerList))
for i in range(len(headerList)):
headerItem = QTableWidgetItem(headerList[i])
font = headerItem.font()
font.setPointSize(11)
headerItem.setFont(font)
headerItem.setBackground(QBrush(Qt.red))
self.tableWidget.setHorizontalHeaderItem(i, headerItem)
- 设置行数
- 根据spinBox内的数值设置表格的行数。
- setRowCount:设置行数。
- setAlternatingRowColors:设置是否交替行背景颜色。
def btnSetRows_clicked(self):
self.tableWidget.setRowCount(self.spinBox.value())
self.tableWidget.setAlternatingRowColors(self.chkBoxBackground.isChecked())
现在就可以在表格内输入值了
- tableWidget内常用的信号
- currentCellChanged:当前单元格的选择发生改变,传递当前单元格的行号和列号。
- currentItemChanged:和currentCellChanged一样。传递的是两个QTableWidgetItem对象。
- cellChanged:单元格内的值发生改变。
- cellClicked:鼠标点击单元格。
- cellDoubleClicked:鼠标双击单元格。
当单元格内发生改变之后,先读取单元格内内容。
item = self.tableWidget.item(currentRow, currentColumn)
cellText = item.text()
如果性别列内是男生,则在设置该单元格的ico为男性标志。如果民族列内不是汉族,则把单元格的背景颜色设置为蓝色。如果出生日期列内值发生改变,则自动计算岁数。
def currentCellChanged(self, currentRow, currentColumn):
try:
icoPathMale = os.getcwd() + "\\Icon\男.ico"
icoPathFemale = os.getcwd() + "\\Icon\女.ico"
item = self.tableWidget.item(currentRow, currentColumn)
cellText = item.text()
if currentColumn == 2:
if cellText == "男":
ico = QIcon(icoPathMale)
item2 = QTableWidgetItem(" 男", CellTyp.ctSex.value)
item2.setIcon(ico)
self.tableWidget.setItem(currentRow, 2, item2)
if cellText == "女":
ico = QIcon(icoPathFemale)
item2 = QTableWidgetItem(" 女", CellTyp.ctSex.value)
item2.setIcon(ico)
self.tableWidget.setItem(currentRow, 2, item2)
if currentColumn == 3:
birthYear = int(cellText[:4])
dataTime = int(QDate.currentDate().year())
age = dataTime - birthYear
item2 = QTableWidgetItem(str(age), CellTyp.ctAge.value)
self.tableWidget.setItem(currentRow, 5, item2)
if currentColumn == 4:
if cellText != "汉族":
item2 = QTableWidgetItem(cellText, CellTyp.ctNation.value)
item2.setBackground(QBrush(Qt.blue))
self.tableWidget.setItem(currentRow, 4, item2)
except Exception as e:
print(e)
- 插入行、添加行、删除行和清除内容。
def btnInsertRow_clicked(self):
currentRow = self.tableWidget.currentRow()
self.tableWidget.insertRow(currentRow)
def btnAppendRow_clicked(self):
currentRow = self.tableWidget.rowCount()
self.tableWidget.insertRow(currentRow)
def btnDelCurRow_clicked(self):
currentRow = self.tableWidget.currentRow()
self.tableWidget.removeRow(currentRow)
def btnClear_clicked(self):
self.tableWidget.clearContents()
- 自动宽和高
def btnAutoHeight_clicked(self):
self.tableWidget.resizeRowsToContents()
def btnAutoWidth_clicked(self):
self.tableWidget.resizeColumnsToContents()
- 设置表头是否显示
def chkBoxRowHeader_clicked(self, checked):
self.tableWidget.horizontalHeader().setVisible(checked)
def chkBoxColHeader_clicked(self, checked):
self.tableWidget.verticalHeader().setVisible(checked)
- 表格是否使用交替底色显示
def chkBoxBackground_clicked(self, checked):
self.tableWidget.setAlternatingRowColors(checked)
- 选择模式,每次点击时选择单元格还是每一行
def radioRowSelect_clicked(self):
selMode = QAbstractItemView.SelectRows
self.tableWidget.setSelectionBehavior(selMode)
def radioCellSelect_clicked(self):
selMode = QAbstractItemView.SelectItems
self.tableWidget.setSelectionBehavior(selMode)
- 表格是否可以编辑
def chkBoxEditable_clicked(self, checked):
if checked:
trig = (QAbstractItemView.DoubleClicked | QAbstractItemView.SelectedClicked)
else:
trig = QAbstractItemView.NoEditTriggers
self.tableWidget.setEditTriggers(trig)
- 遍历读取表格内容
注意:表格内的须有内容,不然会报错。
def btnGetText_clicked(self):
try:
rowCount = self.tableWidget.rowCount()
colCount = self.tableWidget.columnCount()
for i in range(rowCount):
strText = "第 %d 行: " % (i+1)
for j in range(colCount):
cellItem = self.tableWidget.item(i, j)
strText = strText + cellItem.text() + " "
self.textBrowser.setText(strText)
except Exception as e:
print(e)
一个简单的案例介绍QTableWidget的使用。如果需要源代码可关注私聊,感谢支持!!!!