【问题标题】:PySide: Segfault(?) when using QItemSelectionModel with QListViewPySide:将 QItemSelectionModel 与 QListView 一起使用时的 Segfault(?)
【发布时间】:2013-10-13 05:38:21
【问题描述】:

与此完全相同的问题:Connecting QTableView selectionChanged signal produces segfault with PyQt

我有一个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 的“应用程序名称已停止工作”。我很确定这是一个段错误。

但是,当我使用 PyQt4 时,它工作正常。我使用 PySide 因为它是 LGPL。

是的,我使用的是最新版本(PySide:1.2.1、Python 2.7.5、Qt 4.8.5)。

谁能帮我解决这个问题?

【问题讨论】:

    标签: python qt crash segmentation-fault pyside


    【解决方案1】:

    尝试在选择模型的生命周期内保持对选择模型的引用。这对我有类似的问题(连接到表视图选择模型上的 currentChanged 事件时出现段错误)。

    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)
    

    由于某种原因,最后两行有效,而将它们组合成一个命令会引发错误。

    【讨论】:

    • 这对我也有用。 (我在最后一行使用了 self.server_list_selection_model 而不是 self.server_list.selectionModel()。)但是为什么这行得通并且问题中的代码不起作用?
    • 你说得对,最后一行应该是self.server_list_selectionModel。我会纠正的。我自己也不太明白,但问题是由 qt 与 pyside 绑定交互(或者更确切地说不交互)的引用计数垃圾收集实现引起的。
    • 如果您不想保留对选择模型的引用,您可以使用老式的信号接线语法:QtCore.QObject.connect(self.server_list.selectionModel(), QtCore.SIGNAL("currentChanged(QModelIndex, QModelIndex)"), self.server_changed)。不知道在保留选择模型的时候有没有什么陷阱。但我更喜欢写selectionChanged.connect(self.server_changed),就像你一样。
    【解决方案2】:

    同样的问题: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!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多