У меня есть пользовательский набор классов, производных от 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