【发布时间】:2016-08-23 17:56:56
【问题描述】:
this answer 中给出的退出时崩溃的解决方法适用于 pyqt4。
但不使用 pyqt5,它经常(超过一半的时间)出现分段错误。
只有导入行改变了
#!/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_())
这是回溯,from the core dump(作为旁注,在 gdb 内部,没有崩溃)
[New LWP 4684]
[New LWP 4683]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `python grview_qt5.py'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00007f5233393e69 in ?? ()
(gdb) bt
#0 0x00007f5233393e69 in ()
#1 0x00007f522fee6f20 in ()
#2 0x0000000000e0d340 in ()
#3 0x00007f522fee6f20 in ()
#4 0x0000000000e0d5f0 in ()
#5 0x00007f523e0bc000 in _rtld_local () at /lib64/ld-linux-x86-64.so.2
#6 0x00007f523ae7285f in QThreadPrivate::start(void*) (arg=0xe0d340) at thread/qthread_unix.cpp:337
#7 0x00007f523d8780a4 in start_thread (arg=0x7f522fee7700) at pthread_create.c:309
#8 0x00007f523d5adcbd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
(gdb) info threads
Id Target Id Frame
2 Thread 0x7f523e06f700 (LWP 4683) 0x00007f523deb21c7 in munmap () at ../sysdeps/unix/syscall-template.S:81
* 1 Thread 0x7f522fee7700 (LWP 4684) 0x00007f5233393e69 in ?? ()
为什么pyqt4和pyqt5有区别?
肯定和Object Destruction on Exit有关系,但是怎么回事?
避免这种崩溃的正确方法是什么?
【问题讨论】:
-
python3 删除对象的时间与 python2 不同。尝试在 sys.exit 之前对对象使用显式 del:del grview;del scene;del app;.
-
用
QtCore.QTimer.singleShot(1000, app.quit)替换所有图形内容,这样就只创建了一个QApplication。如果仍然崩溃,请尝试使用QCoreApplication。这可能有助于缩小问题的根源。 -
@ekhumoro 将所有图形内容替换为
QTimer.singleShot(1000, app.quit),没有崩溃。
标签: crash segmentation-fault pyqt pyqt4 pyqt5