2012-04-01 21 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 

Tek bir QDataWidgetMapper için mutiple delegeleri nasıl kurabilirim? Anladığım kadarıyla QDataWidgetMapper.setItemDelegateForColumn() diye bir bilgi yok Veya uygun delegeleri kullanacak bir delege fabrikası oluşturmam gerekiyor mu?QDataWidgetMapper ve birden çok delege

Teşekkürler!

cevap

3

Tek bir temsilci kullanmak ve temsilcisinin setEditorData ve setModelData işlevlerindeki farklı parçacıkların davranış şeklini kullanmanız gerekir. Örnek için (C++ fakat düz ileri) this article from Qt Quarterly'u kontrol edin.

+0

teşekkür içindedir I: Yani, ana fikri onlardan \ gerçek temsilci örnekleri ve güzergahları verilerin listesini tutar bu sınıf (basitleştirilmiş versiyonu) olduğunu Bu makaleyi gördük, ancak görevi başarmak için daha akıcı bir yol ümit ettiler. Sonuçta, tüm gerekli işlevsellikle QTableView için delegelerim var. Oh iyi. Eğer antagonist yolu yok ise ... – AlexVhr

1

Ben de bu sorunu buldum, ve gerçekten berbat. Ben şimdi bu geçici çözüm için alt sınıf QtGui.QDataWidgetMapper denemek için çalışıyorum, alt sınıf kendi delme bir argüman ile kendi addMapping() sahip, her bir widget için temsilci saklamak için bir dict ve uygun olarak adlandırılan eşleşen meta-delegate her dava için delege.

bu tuhaf şey de setItemDelegateForColumn() yöntemi ekleme sabitlendi daha erkene QAbstractItemView içinde Qt 4 sürümleri (yani tablolar ve ağaçlar) varolan ve problem olmakla QDataWidgetMapper düzeltme alamadım.

alternatif bir eşleştiricisindeki daha kullanarak ve gerekirse senkronize halde tutmak için onları bağlamak, ancak farklı özel delegelerin çok ihtiyaç özel olarak ise, biraz dağınık olabilir:

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

Evet, gerçekten 'gerçekten berbat' kısmı ile katılıyorum. Çalıştığını bildiğin için teşekkürler. İlerlemeyi izleyebileceğim bir blogunuz veya başka bir yeriniz var mı? – AlexVhr

3

Tamam , Anladım. (En azından benim için çalışıyor).

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) 

Tam çalışma örneği pastebin

İlgili konular