在委托的createEditor期间如何从同一行中的另一个单元格访问窗口小部件

时间:2019-09-30 22:25:49

标签: python pyqt pyqt5 qtableview qstyleditemdelegate

我有一组自定义的类,它们是从QStyledItemDelegate,QAbstractModel和QTableView派生的。

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

如果在第二个ComboBox上的Delegate.createEditor期间,我有办法访问第一个,则可以像建议的here一样进行连接。

我能想到的就是创建一个字典来存储对ComboBox的引用,以便在创建第二个ComboBox时可以检索到它。在删除方面,委托人一无所知,但模型却不知道,所以我有完整的实施策略。

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

我的实施策略:

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

0 个答案:

没有答案