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) 

그러나 선택 모델을 사용중인 마지막 행에 도달하면 앱이 다운됩니다. 역 추적이 아니라 Windows에서 "appname has working working"이 (가) 중지되었습니다. 나는 그게 segfault라고 확신한다.

하지만 PyQt4를 사용할 때 정상적으로 작동합니다. LGPL이므로 PySide를 사용하고 있습니다.

예, 저는 모든 최신 버전입니다 (PySide : 1.2.1, Python 2.7.5, Qt 4.8.5).

아무도 도와 줄 수 있습니까?

답변

13

선택 모델의 유효 기간 동안 선택 모델에 대한 참조를 보유하고 있습니다. 그게 나에게도 비슷한 문제 (테이블 뷰 선택 모델에서 currentChanged 이벤트에 연결할 때 seg 오류)와 함께 작동했습니다.

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이어야합니다. 나는 그것을 바로 잡을 것이다. 직접 이해할 수는 없지만 문제는 pyside 바인딩과 상호 작용하는 (또는 오히려 상호 작용하지 않는) qt의 참조 카운팅 가비지 콜렉션 구현에 의해 발생합니다. – Valakyr

+0

선택 모델에 대한 참조를 유지하고 싶지 않다면 구식 신호 배선 구문을 사용할 수 있습니다 :'QtCore.QObject.connect (self.server_list.selectionModel(), QtCore.SIGNAL ("currentChanged (QModelIndex, QModelIndex) "), self.server_changed)'를 사용하십시오. 선택 모델을 유지할 때 트랩이 있는지 알 수 없습니다. 하지만 당신이하는 것처럼'selectionChanged.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!