QABstractTableModel移除工具

2024-04-25 18:01:39 发布

您现在位置:Python中文网/ 问答频道 /正文

代码几乎完成了。交易如下:

它是python和PySide。我有一个QAbstractTableModel和一个QTableView。在

我无法正确删除行。我想问题出在我删除其中一行的索引中。。。在

下面是我使用的按钮代理:

class ButtonDelegate(QItemDelegate):

    def __init__(self, parent):
        QItemDelegate.__init__(self, parent)

    def paint(self, painter, option, index):

        widget = QWidget()
        layout = QHBoxLayout()
        widget.setLayout(layout)
        btn = QPushButton("X")
        btn.clicked.connect(partial(self.parent().cellButtonClicked, index))
        layout.addWidget(btn)
        layout.setContentsMargins(2,2,2,2)

        if not self.parent().indexWidget(index):
            self.parent().setIndexWidget(index, widget)

下面是cellButtonClicked方法,它位于表视图下:

^{pr2}$

下面是模型移除方法:

def removeRow(self, row, parent = QtCore.QModelIndex()):

    self.beginRemoveRows(parent, row, row)

    array = []
    for i in range(7):
        if i == 0:
            array.append(self.index(row, i).data())
        else:
            array.append(str(self.index(row, i).data()))

    self.cycles.remove(array)

    self.endRemoveRows()

    # update custom node in maya. 
    self.getData()

我认为,主要的问题是,当我删除一行时,它不会更新模型的索引。因此,当我再次单击任何delete按钮时,它将启动deremoverow(),其中的索引与模型的行数不再匹配,因此我无法构建要从模型数据中删除的数组。在

有道理吗?如果你需要更多的代码,告诉我你需要什么。在


Tags: 代码模型selfindexinitdefwidgetarray
1条回答
网友
1楼 · 发布于 2024-04-25 18:01:39

造成此问题的原因是在创建每个委托时已设置行的值,因此其值不会更新。在

一个可能的解决方案是使用lambda函数传递与临时QModelIndex相关联的QPersistenModelIndex,但是我看到有一个意外的行为正在创建一个选择,所以我调用了clearSelection()。在

不需要连接到cellButtonClicked插槽,因为您可以使用QModelIndex或QPersistenModelIndex直接访问模型。在

^{1}$

另一个选项是通过editorEvent处理单击事件,因为提供的QModelIndex已更新值,如下所示:

^{pr2}$

除此之外,不需要遍历data(),我们可以直接删除行:

def removeRow(self, row, parent=QModelIndex()):
    self.beginRemoveRows(parent, row, row)
    self.cycles.remove(self.cycles[row])
    self.endRemoveRows()
    self.getData()

在下面的link中,这两个选项都实现了。在

相关问题 更多 >