如何使用PyQt5创建可编辑的表格

发布时间:2023-05-19

一、基本概念

在GUI编程中,表格是一个常用的控件之一。在PyQt5中,我们可以通过QTableWidgetQTableWidgetItem创建可编辑的表格。 QTableWidget是一个用于显示数据的小部件。它是基于模型/视图架构的,其数据存储在QTableWidget自身的模型中,我们通过自定义QTableWidgetItem在视图中展示。每一个QTableWidgetItem代表着一个单元格中的数据。 通过使用QTableWidget,我们可以创建一个二维表格。

二、创建可编辑的表格

我们可以通过以下代码创建一个可编辑的表格:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem
class Table(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle('表格')
        self.setGeometry(300, 300, 500, 300)
        self.createTable()
        self.show()
    def createTable(self):
        self.table = QTableWidget()
        self.table.setRowCount(4)
        self.table.setColumnCount(2)
        self.table.setHorizontalHeaderLabels(['姓名', '年龄'])
        for i in range(4):
            for j in range(2):
                item = QTableWidgetItem()
                item.setText('({}, {})'.format(i, j))
                self.table.setItem(i, j, item)
        self.table.cellChanged.connect(self.printTable)
        layout = QVBoxLayout()
        layout.addWidget(self.table)
        self.setLayout(layout)
    def printTable(self, row, column):
        item = self.table.item(row, column)
        print(item.text())
if __name__ == '__main__':
    app = QApplication(sys.argv)
    table = Table()
    sys.exit(app.exec_())

在这个例子中,我们创建了一个4行2列的表格,并且设置了水平表头。我们通过循环设置每一个单元格的数据,最终在GUI中呈现出来。 同时我们也设置了cellChanged事件的监听,可以在单元格数据发生变化时触发事件并打印出变化后的文本。

三、在表格中插入控件

QTableWidgetItem支持在单元格中插入控件。我们可以通过以下代码创建一个带有QCheckBox的单元格:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, QCheckBox, QHBoxLayout, QVBoxLayout
class Table(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle('表格')
        self.setGeometry(300, 300, 500, 300)
        self.createTable()
        self.show()
    def createTable(self):
        self.table = QTableWidget()
        self.table.setRowCount(4)
        self.table.setColumnCount(2)
        self.table.setHorizontalHeaderLabels(['姓名', '选项'])
        for i in range(4):
            for j in range(2):
                if j == 0:
                    item = QTableWidgetItem()
                    item.setText('({}, {})'.format(i, j))
                    self.table.setItem(i, j, item)
                else:
                    cb = QCheckBox('选项{}'.format(i+1))
                    layout = QHBoxLayout()
                    layout.addWidget(cb)
                    layout.setAlignment(cb, QtCore.Qt.AlignCenter)
                    widget = QWidget()
                    widget.setLayout(layout)
                    self.table.setCellWidget(i, j, widget)
        self.table.cellChanged.connect(self.printTable)
        layout = QVBoxLayout()
        layout.addWidget(self.table)
        self.setLayout(layout)
    def printTable(self, row, column):
        if column == 1:
            widget = self.table.cellWidget(row, column)
            cb = widget.children()[0]
            print(cb.isChecked())
if __name__ == '__main__':
    app = QApplication(sys.argv)
    table = Table()
    sys.exit(app.exec_())

在这个例子中,我们创建了一个带有QCheckBox的表格。我们通过QHBoxLayout创建一个带有一个QCheckBox的控件,并设置为单元格中的Widget。 在cellChanged事件中,我们可以通过cellWidget获取单元格中的Widget,并进一步获取QCheckBox控件的状态值。

四、总结

在PyQt5中,我们可以通过QTableWidgetQTableWidgetItem创建可编辑的表格,同时也可以在单元格中插入控件,丰富表格的展示形式。 以上是如何使用PyQt5创建可编辑的表格的详细阐述,希望可以对你有所帮助。