如何在代理的CreateDI过程中从同一行中的另一个单元格访问小部件

2024-10-01 05:04:37 发布

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

我有一组自定义的类,这些类派生自QStyledItemDelegate、QAbstractModel和QTableView

在TableView的每一行中,我有两个组合框,第一个包含一个类别,第二个用于显示子类别,因此每当第一个组合框中的索引发生更改时,我必须在第二个组合框中调用clear+addItems

如果在第二个组合框上的Delegate.createEditor期间,我有办法访问第一个组合框,那么我可以类似地连接到建议的here

我所能想到的就是创建一个字典来存储对组合框的引用,这样我就可以在创建第二个组合框时检索第一个组合框。删除方面,代理什么都不知道,但是模型知道,所以我有一个完整的实现策略

我的问题:有更好的方法吗

我的执行战略:

class Delegate(QtWidgets.QStyledItemDelegate):
    def __init__(self):
        super().__init__()
        self.widget_table = {}

    def get_widget(self, row, col):
        if (row, col) in self.widget_table:
            return self.widget_table[(row, col)]
        return None

    def add_widget(self, row, col, widget):
        self.widget_table[(row, column)] = widget

    def createEditor(self, parent, option, index):
        value = self.model.data(index)
        #Imagine that MAKE_WIDGET knows what widget type to create depending on the column.
        widget = MAKE_WIDGET(index.column(), parent)
        if index.column() == 3:  # e.g. combo boxes are at col 2 and 3
            cb1 = self.get_widget(index.row(), 2)
            cb1.currentIndexChanged[str].connect(widget.MY_CALLBACK)
        self.add_widget(index.row(), index.column, widget)
        return widget

Tags: selfgetindexreturninitdeftablecolumn