0

我正在使用 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_())

提前感谢您的帮助

皮埃尔

4

1 回答 1

0

这可能是 PySide 中的一个错误。

我在运行您的示例时看到的是由于双重免费而导致的崩溃。当 python 事件对象超出范围时,底层 C++ 事件对象可能被销毁一次,并且当事件被 StateMachine 删除时,正如文档所述:

状态机获得事件的所有权,并在处理完事件后将其删除。

如果 StateMachine 获得事件的所有权,则您不需要保留引用。

最好提交一份错误报告

相同的代码不会与PyQt4.

于 2013-06-25T07:57:01.223 回答