我正在使用PySide 1.1.1和python 2.7在Linux Ubuntu 12.10上工作 通过QStateMachine发布QEvent时遇到问题。
如果我想让它工作,我必须保留对事件的引用,否则它会崩溃。 我已经设置了一些示例代码来说明我的问题。
我想知道我做错了还是已知问题,是否应该使用解决方法(保留对事件的引用)?
#!/usr/bin/python
from __future__ import print_function
import sys
from PySide.QtCore import *
from PySide.QtGui import *
app = QApplication(sys.argv)
sm = QStateMachine()
init = QState(sm)
sm.setInitialState(init)
sm.start()
e = None
def no_crash():
global e
print("send an event that doesn't crash...")
e = QEvent(QEvent.Type(QEvent.registerEventType()))
sm.postEvent(e)
def crash():
print("and one that does...")
e = QEvent(QEvent.Type(QEvent.registerEventType()))
sm.postEvent(e)
QTimer.singleShot(2000, no_crash)
QTimer.singleShot(4000, crash)
sys.exit(app.exec_())
先谢谢你的帮助
皮尔
答案 0 :(得分:0)
这可能是PySide中的一个错误。
当我运行你的例子时,我看到的是因为双重免费而崩溃。当python事件对象超出范围时,或者当StateMachine删除事件时,可能会破坏底层C ++事件对象,如documentation所示:
状态机获取事件的所有权,并在处理完事件后将其删除。
如果StateMachine负责该活动,您不需要保留参考。
最好提交bug report。
相同的代码不会因PyQt4
而崩溃。