2013-10-06 19 views
8

Stesso problema esatto come questo (?): Connecting QTableView selectionChanged signal produces segfault with PyQtPySide: Segfault quando si utilizza QItemSelectionModel con QListView

Ho un QListView, e voglio chiamare una funzione quando si seleziona un elemento:

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) 

Ma quando raggiunge l'ultima riga, dove sto usando il modello di selezione, l'app si blocca. Non con un traceback, ma con un "appname ha smesso di funzionare" da Windows. Sono abbastanza sicuro che sia un segfault.

MA, quando uso PyQt4 funziona correttamente. Sto usando PySide perché è LGPL.

Sì, sono sulle ultime versioni di tutto (PySide: 1.2.1, Python 2.7.5, Qt 4.8.5).

Qualcuno può aiutarmi con questo?

risposta

13

Provare a mantenere un riferimento al modello di selezione per la durata del modello di selezione. Questo ha funzionato per me con un problema simile (errore del segmento durante la connessione all'evento currentChanged su una tabella visualizza il modello di selezione).

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) 

Per qualche motivo, le ultime due righe funzionano, mentre combinarle in un unico comando genera un errore.

+0

questo ha funzionato anche per me. (Ho usato self.server_list_selection_model nell'ultima riga invece di self.server_list.selectionModel()). Ma perché funziona e il codice nella domanda non funziona? –

+0

Hai ragione, dovrebbe essere self.server_list_selectionModel nell'ultima riga. Lo correggerò. Non riesco a capirlo da solo, ma il problema è causato dall'implementazione della raccolta dei rifiuti conteggio di riferimento di qt che interagisce (o meglio non interagisce) con i collegamenti di campagna. – Valakyr

+0

Se non si desidera mantenere un riferimento al modello di selezione, è possibile utilizzare la sintassi del cablaggio del segnale vecchio stile: 'QtCore.QObject.connect (self.server_list.selectionModel(), QtCore.SIGNAL (" currentChanged (QModelIndex, QModelIndex) "), self.server_changed)'. Non so se ci sono trappole quando si mantiene il modello di selezione. Ma preferisco scrivere 'selectionChanged.connect (self.server_changed)', come lo fai anche tu. –

3

Stesso problema qui: http://permalink.gmane.org/gmane.comp.lib.qt.pyside.devel/541

E ho anche risposto: http://permalink.gmane.org/gmane.comp.lib.qt.pyside.devel/542

ho il sospetto ciò che accade è:

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!