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 

तो ... मैं एक QDataWidgetMapper के लिए एकाधिक प्रतिनिधियों को कैसे स्थापित करूं? जहां तक ​​मैं समझता हूँ कि कोई QDataWidgetMapper.setItemDelegateForColumn() या करना चाहते हैं मैं कुछ प्रतिनिधि कारखाना है, जो उचित प्रतिनिधियों का उपयोग करेगा बनाने के लिए है?QDataWidgetMapper और एकाधिक प्रतिनिधि

धन्यवाद!

उत्तर

3

आपको एक एकल प्रतिनिधि का उपयोग करना होगा और प्रतिनिधि के setEditorData और setModelData कार्यों में विभिन्न विगेट्स के व्यवहार को संभालना होगा। एक उदाहरण (सी ++ लेकिन सीधे आगे) के लिए this article from Qt Quarterly की जाँच करें।

+0

धन्यवाद है मैं: तो, मुख्य विचार इस वर्ग (एक सरलीकृत संस्करण) है, जो उन लोगों से \ करने के लिए वास्तविक प्रतिनिधि उदाहरणों और मार्गों डेटा की एक सूची रखता है इस आलेख को देखा है, लेकिन कार्य को प्राप्त करने के लिए एक और सुव्यवस्थित तरीके की उम्मीद है। सब के बाद, मैं allready सभी आवश्यक कार्यक्षमता के साथ QTableView के लिए मेरे प्रतिनिधियों मिल गया है। ओह अच्छा। यदि कोई anoter रास्ता ... – AlexVhr

1

मैं भी इस समस्या को मिल गया है, और यह वास्तव में बेकार है। मैं अभी QtGui.QDataWidgetMapper उपवर्ग के क्रम में इस समाधान करने के लिए, उपवर्ग एक प्रतिनिधि तर्क के साथ अपने स्वयं के addMapping() होने, एक dict प्रत्येक विजेट के लिए प्रतिनिधि, और मेल खाता हुआ मेटा-प्रतिनिधि है कि उचित कॉल स्टोर करने के लिए कोशिश कर रहा हूँ प्रत्येक मामले के लिए प्रतिनिधि।

इस बारे में अजीब बात यह है कि समस्या भी (पेड़ यानी टेबल और) QAbstractItemView में क्यूटी 4 के पुराने संस्करणों में ही अस्तित्व में है और बाद में setItemDelegateForColumn() विधि जोड़ने तय किया गया था है, लेकिन QDataWidgetMapper ठीक नहीं मिला।

एक वैकल्पिक एक नक्शाकार से ज्यादा का उपयोग कर किया जा सकता है, और उन्हें कनेक्ट उन्हें सिंक में रखने के लिए यदि आवश्यक हो, लेकिन यह थोड़ा गंदा विशेष रूप से यदि आप अलग अलग विशेष प्रतिनिधियों की बहुत सारी की आवश्यकता है,:

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

हाँ, मैं तहे दिल से 'वास्तव में बेकार है' भाग के साथ सहमत हैं। मुझे आपके काम के बारे में बताने के लिए धन्यवाद। क्या आपके पास कोई ब्लॉग या कोई अन्य स्थान है जहां मैं प्रगति को ट्रैक कर सकता हूं? – AlexVhr

3

ठीक है , मैं समझ गया। (कम से कम, यह मेरे लिए काम करता है)। ,

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