Как получить доступ к виджету из другой ячейки в той же строке во время делегата createEditor - PullRequest
0 голосов
/ 01 октября 2019

У меня есть пользовательский набор классов, производных от QStyledItemDelegate, QAbstractModel и QTableView.

В каждой строке TableView у меня есть два ComboBox, первый содержит категорию, второй предназначен для отображения подкатегорий,следовательно, я должен вызывать clear + addItems для второго при каждом изменении индекса в первом.

Если во время Delegate.createEditor на втором ComboBox у меня был способ доступа к первому, я мог просто подключиться аналогичночто предложено здесь .

Все, что я могу придумать, это создать словарь для хранения ссылок на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...