2012-04-01 13 views
5
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 

Entonces ... ¿Cómo configuro multiples delegados para un solo QDataWidgetMapper? Por lo que yo entiendo, no hay QDataWidgetMapper.setItemDelegateForColumn() ¿O tengo que crear alguna fábrica de delegados, que utilizará los delegados apropiados?QDataWidgetMapper y delegados múltiples

Gracias!

Respuesta

3

Tiene que usar un único delegado y manejar el comportamiento de los diferentes widgets en las funciones setEditorData y setModelData del delegado. Para un ejemplo (C++ pero directo) marque this article from Qt Quarterly.

+0

Gracias, He visto este artículo, pero esperaba una forma más simplificada para lograr la tarea. Después de todo, ya tengo mis delegados para QTableView con toda la funcionalidad necesaria. Oh bien. Si no hay otra forma de anot ... – AlexVhr

1

Encontré este problema también, y realmente apesta. En este momento estoy tratando de subclasificar QtGui.QDataWidgetMapper para solucionar esto, la subclase tiene su propio addMapping() con un argumento delegado, un dict para almacenar el delegado para cada widget, y un meta-delegado coincidente que llama al apropiado delegado para cada caso

Lo más raro de esto es que el problema también existía en versiones anteriores de Qt 4 en QAbstractItemView (es decir, tablas y árboles) y luego se arregló agregando el método setItemDelegateForColumn(), pero QDataWidgetMapper no obtuvo la corrección.

Una alternativa podría ser el uso de más de un mapeador, y conectarlos a mantenerlos sincronizados si es necesario, pero es un poco complicado, especialmente si usted necesita una gran cantidad de diferentes delegados especiales:

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)) 
+0

Sí, estoy completamente de acuerdo con la parte 'realmente apesta'. Gracias por informarme sobre tu trabajo. ¿Tienes un blog o algún otro lugar donde pueda seguir el progreso? – AlexVhr

3

Ok , Entiendo. (Al menos, funciona para mí). Por lo tanto, la idea principal es esta clase (una versión simplificada), que mantiene una lista de bienes de delegado instancias y enruta los datos a \ de ellos:

ejemplo
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) 

Totalmente de trabajo se encuentra en las pastebin