QDataWidgetMapper и несколько делегатов - PullRequest
5 голосов
/ 02 апреля 2012
mapper = QtGui.QDataWidgetMapper()
mapper.setModel(my_table_model)
mapper.addMapping(widgetA, 0) #mapping widget to a column
mapper.addMapping(widgetB, 1) #mapping widget to a column
mapper.setItemDelegate(MyDelegateA(widgetA)) #Hmm. Where is the 'column' parameter?
mapper.setItemDelegate(MyDelegateB(widgetB)) #now itemDelegate is rewritten, MyDelegateB will be used

Итак ... Как мне настроить несколько делегатов для одного QDataWidgetMapper? Насколько я понимаю, нет QDataWidgetMapper.setItemDelegateForColumn() Или мне нужно создать фабрику делегатов, которая будет использовать соответствующие делегаты?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

Вы должны использовать один единственный делегат и управлять поведением различных виджетов в функциях setEditorData и setModelData делегата. Для примера (C ++, но прямо) проверьте эту статью из Qt Quarterly .

3 голосов
/ 29 апреля 2012

Хорошо, я понял. (По крайней мере, у меня это работает). Итак, основная идея - этот класс (упрощенная версия), который хранит список реальных экземпляров делегатов и направляет в них данные \:

class DelegateProxy(QtGui.QStyledItemDelegate):

    def __init__(self, delegates, parent=None):
        QtGui.QStyledItemDelegate.__init__(self, parent)
        self.delegates = delegates

    def setEditorData(self, editor, index):
        delegate = self.delegates[index.column()] 
        delegate.setEditorData(editor, index)

    def setModelData(self, editor, model, index):
        delegate = self.delegates[index.column()]
        delegate.setModelData(editor, model, index)

Полностью рабочий пример в pastebin

1 голос
/ 25 апреля 2012

Я тоже нашел эту проблему, и она действительно отстой.Я сейчас пытаюсь создать подкласс QtGui.QDataWidgetMapper, чтобы обойти это, подкласс имеет свой собственный addMapping () с аргументом делегата, диктат для хранения делегата для каждого виджета и соответствующий мета-делегат, который вызывает подходящееделегат для каждого случая.

Самое странное в этом - проблема, которая также существовала в более ранних версиях Qt 4 в QAbstractItemView (то есть в таблицах и деревьях) и позже была исправлена ​​добавлением метода setItemDelegateForColumn (), но QDataWidgetMapper didn 'не получите исправления.

Альтернативой может быть использование более, чем маппера, и подключение их для синхронизации при необходимости, но это немного грязно, особенно если вам нужно много разных специальных делегатов:

mainMapper = QtGui.QDataWidgetMapper()
mainMapper.setModel(my_table_model)

auxMapper1 = QtGui.QDataWidgetMapper()
auxMapper1.setModel(my_table_model)

# If you move the index in the main mapper, the auxiliary will follow
mainMapper.currentIndexChanged.connect(auxMapper1.setCurrentIndex)

mainMapper.addMapping(widgetA, 0) #mapping widget to a column
auxMapper1.addMapping(widgetB, 1) #mapping widget to a column

mainMapper.setItemDelegate(MyDelegateA(widgetA))
auxMapper1.setItemDelegate(MyDelegateB(widgetB))
...