如何使用 pyside 在 QtableView 单元格中设置数据

Posted

技术标签:

【中文标题】如何使用 pyside 在 QtableView 单元格中设置数据【英文标题】:How to SetData in a QtableView Cell using pyside 【发布时间】:2020-12-09 15:25:05 【问题描述】:

我正在尝试在 QtableView 的单元格中设置一个值。我正在使用 Pyside2。

class TableModel(QtCore.QAbstractTableModel):

    def __init__(self, mlist=None):
        super(TableModel, self).__init__()
        self._items = [] if mlist == None else mlist
        self._header = []

    def data(self, index, role = QtCore.Qt.DisplayRole):
        if not index.isValid():
           return None
        if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
            return self._items[index.row()][index.column()]
        return None

    def setData(self, index, value, role = QtCore.Qt.EditRole):
        if value is not None and role == QtCore.Qt.EditRole:
            self._items[index.row()][index.column()] = value
            return True
        return False

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
 # skip the irrelevant code #
    Table = QTableView()
    model = TableModel()
    Table.setModel(model)
    row, column = a_function_that_outputs_the_row_and_column_of_the_cell_to_edit()

    self.Table.model().setData(index ?, value)

我正在努力理解如何将索引作为参数传递,我有行和列,对如何正确执行此操作有任何帮助吗?

【问题讨论】:

【参考方案1】:

您需要使用model.index(row, column, parent=None)(参见documentation)来获取相应的QModelIndex。 如果模型是二维的(不是树视图),则不需要父级:

model.setData(model.index(row, column), value)

【讨论】:

谢谢!它似乎解决了这个问题,不过,我的单元格的数据没有改变。我在 setData 行之后添加了以下行: Table.model().dataChanged.emit() ,没有做任何事情吗?再次感谢 @Hamouza 应该发送信号的是 model,所以你应该在模型中的 return True 之前添加 self.dataChanged.emit(index, index) 这是我的调试结果:我在 Mainwindow 类的 Table.model().setData(Table.model().index(row, column), value) 行之前添加了 print(row, column) ,它打印正确的行和列。然后在 setData 我在 self._items[index.row()][index.column() 之前添加了 print('setting ', value, ' in ', index.row(), ' ', index.column()) ] = value,在这里,它告诉我 index.row = -1 和 index.column = -1,所以这就是问题的根源。我不明白为什么,因为我传递给 setdata 的行和列是正确的。我认为这与索引有关.. 你问题中的代码缺少rowCount()columnCount(),你实现了吗? 没有minimal but still fully reproducible examples,很难准确地提供帮助。为了将来参考,请始终确保包含所有所需的代码,尤其是对于数据模型等复杂对象:我们无法“猜测”您在代码中做了什么,但只是在示例中丢失了,并用“你这样做了吗?”/“是的,但我没有举这个例子”不是很有用。永远不要急于发布问题:确保它是好的,如果它的代码必须运行,请自己尝试那个:如果你不能重现它,我们也不能。

以上是关于如何使用 pyside 在 QtableView 单元格中设置数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 PySide2 和 QTableView 如何使用 pandas 模型在表格视图中获得多个委托?

PySide/pyQt 在 QTableView 中显示数据

PySide + SQLAlchemy 中 QTableView 的“模型”设计

使用 PySide2 在 QTableView 中设置文本样式

QTableview,PySide2中单元格的背景颜色

QTableView 上的 PySide 委托,带有文本和刻度