pyQt5中退出时的分段错误,但不是pyQt4

时间:2016-08-23 17:56:57

标签: crash segmentation-fault pyqt pyqt4 pyqt5

this answer中给出的退出崩溃的解决方法适用于pyqt4。

但不使用pyqt5,其中经常(超过一半的时间)出现分段错误。

仅导入行已更改

 public T calcuste(T obj)
 {
      calcaulte testobj= new calcaulte ()
      var t = GetValue(obj); // get the type of class for example that is calcaulte class 

      testobj.Id = obj.Id;// that is what I need to do accessing a  property of T obj 
 }

这是回溯,from the core dump(作为旁注,在gdb内部,没有崩溃)

#!/usr/bin/python

import sys

#toolkit = "Qt4"
toolkit = "Qt5"
if toolkit == "Qt4":
  # Qt4 (no crash)
  from PyQt4.QtCore import *
  from PyQt4.QtGui import *
elif toolkit == "Qt5":
  # Qt5 (crash)
  from PyQt5.QtWidgets import (
    QApplication, QGraphicsScene, QGraphicsView
  )


app = QApplication(sys.argv)

grview = QGraphicsView()

# no crash
scene = QGraphicsScene(parent=grview)

grview.setScene(scene)

grview.show()

sys.exit(app.exec_())

为什么pyqt4和pyqt5之间有区别?

这肯定与Object Destruction on Exit有关,但是如何?

避免此次崩溃的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

我无法使用Fedora 24的PyQt使您的示例崩溃。

但是我也看到了这个问题,并且没有关于如何在python退出之前清理Qt对象的明确答案。我的应用程序有1000个Qt对象,我一点也不清楚我会追踪所有无法清理的对象。

我认为关键是你必须以相反的构造顺序删除你创建的所有对象。注意从任何引用其他对象的Qt对象中删除对象。例如布局中的小部件。

正如我在评论中所说,差异来自于从python2到python3的变化,以及对象删除和垃圾收集。

使用sys.exit()来避免清理是不够的。

您需要使用os._exit(代码)来阻止python运行onExit处理程序。这更有可能抑制seg错误。但是您需要确保运行任何重要的onExit处理程序。例如,删除临时文件。

尝试退出,看看你的问题是否消失。

grview.show()
rc = app.exec_()

del grview
del scene
del app

sys.exit( rc )