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有关,但是如何?
避免此次崩溃的正确方法是什么?
答案 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 )