QTableWidget简介
QTableWidget继承自QTableView, 它提供与QTableView列表视图类似的外观布局,它可以方便地添加和删除部件(QTableWidget可以很方便地为条目设置诸如QPushButton, QLineEdit, QComboBox这样的部件)。QTableWidget使用QTableWidgetItem来管理条目。
可以直接使用需要的行数和列数来创建表格部件
tableWidget = QTableWidget(8, 4, self)
或者不指定行列数目,先创建表格部件,然后再设置其行列数
tableWidget = QTableWidget(self)
tableWidget.setRowCount(8)
tableWidget.setColumnCount(4)
QTableWidget拥有一个水平表头和垂直表头。创建表头的最简单方法是向setHorizontalHeaderLabels()和setVerticalHeaderLabels()函数提供字符串列表。它们可以为表的列和行提供简单的文本标题。可以通过自定义的方式为表格创建更复杂的表头。
QTableWidget常用方法:
- setRowCount(): 设置表格部件的行数;
- rowCount(): 获得表格部件的行数;
- setColumnCount(): 设置表格部件的列数;
- columnCount(): 获得表格部件的列数;
- setCellWidget(): 设置指定单元格的窗口部件;
- cellWidget(): 获得指定单元格的窗口部件;
- item(): 返回指定单元格的条目对象;
- clear(): 删除表格中的所有条目,包括表头;
- clearContents(): 删除表格中不包括表头的所有条目;
- insertColumn(): 将一个空列插入到表格中;
- insertRow(): 将一个空行插入到表格中;
- removeColumn(): 从表中删除指定的列及其所有条目;
- removeRow(): 从表中删除指定的行及其所有条目。
QTableWidget常用信号:
- cellActivated: 单元格被激活时,发射此信号;
- cellChanged: 单元格的数据发生了改变时,发射该信号;
- cellClicked: 单击了单元格时,发射该信号;
- cellDoubleClicked: 双击了一个单元格时,发射该信号;
- cellEntered: 当鼠标进入单元格时,发射该信号;
- cellPressed: 按下表格中的某个单元时,发射该信号;
- currentCellChanged: 每当当前单元格发生改变时,发射该信号;
- currentItemChanged: 当前条目发生更改时,发射该信号;
- itemActivated: 条目被激活时,发射该信号;
- itemChanged: 当条目数据发生改变时,发射该信号;
- itemClicked: 点击条目时,发射该信号;
- itemDoubleClicked: 双击一个条目时,发射该信号;
- itemEntered: 当鼠标进入一个条目时,发射该信号;
- itemPressed: 当按下表格中的条目时,发射该信号;
- itemSelectionChanged: 选择发生更改时,将发射该信号。
QTableWidget类继承关系:
测试QTableWidget
在测试代码中,我们创建一个8行4列的QTableWidget,在第一列中,单元格的部件设置为QComboBox,用于选择不同的状态,在2,3列中,我们使用QLineEdit部件来编辑数据,在第4列中,使用QCheckBox复选框来设置,这是数值是相对值还是绝对值(取消复选就是绝对值)。完整代码如下:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QModelIndex
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTableWidget,
QTableWidgetItem, QHeaderView,
QComboBox, QLineEdit, QCheckBox,
QWidget, QHBoxLayout)
class DemoTableWidget(QMainWindow):
def __init__(self, parent=None):
super(DemoTableWidget, self).__init__(parent)
# 设置窗口标题
self.setWindowTitle('实战PyQt5: QTableWidget 演示')
# 设置窗口大小
self.resize(500, 300)
self.initUi()
def initUi(self):
#行数和列数
rows = 8
cols = 4
tableWidget = QTableWidget(rows, cols, self)
tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem('状态'))
tableWidget.setHorizontalHeaderItem(1, QTableWidgetItem('起始值'))
tableWidget.setHorizontalHeaderItem(2, QTableWidgetItem('结束值'))
tableWidget.setHorizontalHeaderItem(3, QTableWidgetItem('选择'))
#所有列自动拉伸,充满界面
tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
for row in range(rows):
#第一列,启用/禁用选择
cmbState = QComboBox()
cmbState.addItem('Disabled')
cmbState.addItem('Enabled')
cmbState.setCurrentIndex(0)
tableWidget.setCellWidget(row, 0, cmbState)
#第二列,起始值
startVal = QLineEdit('0.0')
startVal.setAlignment(Qt.AlignHCenter)
tableWidget.setCellWidget(row, 1, startVal)
#第三列,结束值
stopVal = QLineEdit('100.0')
stopVal.setAlignment(Qt.AlignHCenter)
tableWidget.setCellWidget(row, 2, stopVal)
#第四列,复选按钮,居中排列
chkBox = QCheckBox('相对值')
chkBox.setChecked(True)
hLayout = QHBoxLayout()
widget = QWidget(tableWidget)
hLayout.addWidget(chkBox)
hLayout.setContentsMargins(0,0,0,0)
hLayout.setAlignment(Qt.AlignHCenter)
widget.setLayout(hLayout)
tableWidget.setCellWidget(row, 3, widget)
self.setCentralWidget(tableWidget)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoTableWidget()
window.show()
sys.exit(app.exec())
运行结果如下图:
测试QTableWidget
本文知识点
- 创建并设置表格部件QTableWidget的方法;
- 设置QTableWidget单元格的部件;
- 在QTableWidget单元格中如何让QCheckBox居中对齐。