📜  pyqt qtableview 获取选定的行数据 - C# (1)

📅  最后修改于: 2023-12-03 15:18:46.339000             🧑  作者: Mango

PyQt QTableView获取选定的行数据

在PyQt中,QTableView可以实现表格的显示和编辑。当用户选定了某行之后,我们需要获取这行的数据以便进一步操作。本文将介绍如何通过PyQt QTableView获取选定的行数据。

步骤
  1. 继承QTableView并实现mousePressEvent函数

在继承QTableView的类中实现mousePressEvent函数,并在该函数中使用QModelIndex和QVariant获取选中行的数据。

class MyTable(QTableView):
    def __init__(self):
        super().__init__()

    def mousePressEvent(self, event):
        item = self.currentItem()
        print(item.text())
  1. 调用selectedIndexes()方法获取选中的行和列

selectedIndexes()方法返回一个QModelIndex对象列表,其中包含选中单元格的行和列信息。

    def mousePressEvent(self, event):
        indexes = self.selectedIndexes()
        print(indexes)
  1. 根据选中的行和列获取对应单元格的数据

使用QModelIndex对象中的data()方法获取对应单元格的数据。

    def mousePressEvent(self, event):
        indexes = self.selectedIndexes()

        for index in indexes:
            print(index.row())
            print(index.column())
            print(index.data())
  1. 获取选中行的所有数据

通过QModelIndex对象的parent()方法获取选中行的父节点,即一个QModelIndex对象,然后使用该对象的child()方法获取每个单元格的数据。

    def mousePressEvent(self, event):
        indexes = self.selectedIndexes()

        row = indexes[0].row()
        model = self.model()
        data = []

        for column in range(model.columnCount()):
            index = model.index(row, column)

            data.append(index.data())

        print(data)
完整代码
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class MyModel(QAbstractTableModel):
    def __init__(self, data):
        super().__init__()
        self._data = data

    def rowCount(self, parent):
        return len(self._data)

    def columnCount(self, parent):
        return len(self._data[0])

    def data(self, index, role):
        if role == Qt.DisplayRole:
            row = index.row()
            column = index.column()
            value = self._data[row][column]
            return value

        return QVariant()

class MyTable(QTableView):
    def __init__(self):
        super().__init__()

    def mousePressEvent(self, event):
        row = self.currentIndex().row()

        model = self.model()
        data = []

        for column in range(model.columnCount()):
            index = model.index(row, column)

            data.append(index.data())

        print(data)

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    data = [[1, 'a', 'male'], [2, 'b', 'female'], [3, 'c', 'male']]

    model = MyModel(data)
    table = MyTable()
    table.setModel(model)

    table.show()

    sys.exit(app.exec_())

参考
  1. PyQt5入门教程之QTableView控件
  2. PyQt5 QTableView获取选中的行号、行数据、行的QModelIndex等