2013-10-06 6 views
8

इस के रूप में एक ही सटीक समस्या से QItemSelectionModel का उपयोग करते समय (?): Connecting QTableView selectionChanged signal produces segfault with PyQtPySide: SEGFAULT QListView

मैं एक QListView है, और मुझे एक समारोह कॉल करना चाहते हैं जब एक आइटम का चयन किया गया है:

self.server_list = QtGui.QListView(self.main_widget) 
self.server_list_model = QtGui.QStandardItemModel() 
self.server_list.setModel(self.server_list_model) 
self.server_list.selectionModel().selectionChanged.connect(self.server_changed) 

लेकिन, जब यह अंतिम पंक्ति तक पहुंच जाता है, जहां मैं चयन मॉडल का उपयोग कर रहा हूं, ऐप क्रैश हो जाता है। ट्रेसबैक के साथ नहीं, लेकिन विंडोज़ से "एपनाम ने काम करना बंद कर दिया है" के साथ। मुझे पूरा यकीन है कि एक segfault है।

लेकिन जब मैं PyQt4 का उपयोग करता हूं तो यह ठीक काम करता है। मैं पायसाइड का उपयोग कर रहा हूं क्योंकि यह एलजीपीएल है।

हां, मैं सब कुछ के नवीनतम संस्करणों पर हूं (पायसाइड: 1.2.1, पायथन 2.7.5, क्यूटी 4.8.5)।

किसी को भी इस के साथ मेरी मदद कर सकते हैं?

उत्तर

13

चयन मॉडल के जीवनकाल के लिए चयन मॉडल का संदर्भ रखने का प्रयास करें। यह मेरे लिए एक समान समस्या के साथ काम करता है (तालिका दृश्य चयन मॉडल पर वर्तमान चेंज किए गए ईवेंट से कनेक्ट करते समय सीईजी गलती)।

self.server_list = QtGui.QListView(self.main_widget) 
self.server_list_model = QtGui.QStandardItemModel() 
self.server_list.setModel(self.server_list_model) 
self.server_list_selection_model = self.server_list.selectionModel() # workaround 
self.server_list_selection_model.selectionChanged.connect(self.server_changed) 

किसी कारण से, अंतिम दो पंक्तियां काम करती हैं, जबकि उन्हें एक कमांड में संयोजित करते समय एक त्रुटि फेंकता है।

+0

यह भी मेरे लिए काम किया। (मैंने self.server_list.selectionModel() के बजाय अंतिम पंक्ति में self.server_list_selection_model का उपयोग किया।) लेकिन यह क्यों काम करता है और प्रश्न में कोड काम नहीं करता है? –

+0

आप सही हैं, यह अंतिम पंक्ति में self.server_list_selectionModel होना चाहिए। मैं इसे सही कर दूंगा। मैं इसे खुद समझ में नहीं आता, लेकिन यह समस्या पीसाइड बाइंडिंग के साथ क्यूटी इंटरैक्टिंग (या बल्कि बातचीत नहीं कर रही) के कचरा संग्रह कार्यान्वयन के संदर्भ में होती है। – Valakyr

+0

यदि आप चयन मॉडल का संदर्भ रखना पसंद नहीं करते हैं तो आप पुराने फैशन सिग्नल वायरिंग सिंटैक्स का उपयोग कर सकते हैं: 'QtCore.QObject.connect (self.server_list.selectionModel(), QtCore.SIGNAL (" currentChanged (QModelIndex, QModelIndex) "), self.server_changed)'। मुझे पता नहीं है कि चयन मॉडल रखते समय कोई जाल है या नहीं। लेकिन मैं 'चयनChanged.connect (self.server_changed) लिखना पसंद करता हूं, जैसा कि आप इसे भी करते हैं। –

3

ही यहाँ समस्या: http://permalink.gmane.org/gmane.comp.lib.qt.pyside.devel/541

और मैं भी उत्तर दिया: http://permalink.gmane.org/gmane.comp.lib.qt.pyside.devel/542

मुझे लगता है क्या होता है:

self.server_list # local object 
.selectionModel() # call C++ method, wraps C++ object in Python object 
.selectionChanged # get property of object 
# selection model is now out of scope and gets garbage collected 
.connect(...) # OOPS! ...operating on object that no longer exists!