2

当我关闭应用程序时,以下示例代码因此错误而崩溃:

QBasicTimer::start: QBasicTimer can only be used with threads started with QThread

这是我的代码:

import sys
from PyQt4 import QtGui ,QtCore

app = QtGui.QApplication(sys.argv)

data=[]
data.append("one")
model=QtGui.QStringListModel(data)

combobox=QtGui.QComboBox()
combobox.show()
combobox.setModel(model)

sys.exit(app.exec_())

我发现这是关于使用模型,但我不知道如何修复它。

编辑:操作系统:win 7 64bit pyqt4

4

1 回答 1

5

该程序没有“崩溃”:它只是在正常关机过程中打印错误消息。

显示消息的原因是垃圾收集的副作用。当 python 关闭时,删除对象的顺序可能无法预测。这可能会导致 C++ 端的对象以“错误”的顺序被删除,因此 Qt 有时会在发生这种情况时抱怨。

“修复”示例代码的一种方法是简单地重命名一些 PyQt 对象。例如,如果我将名称更改comboboxcombo,错误消息就会消失。这并没有什么神秘之处——它只是改变了对象被删除的顺序。

但是另一种更强大的解决问题的方法是确保它QStringListModel有一个父级,因为当它被传递给组合框时,Qt 可能不会获得它的所有权。当它们以这种方式链接在一起时,Qt 应该始终正确地处理子对象的删除。所以代码示例将变为:

import sys
from PyQt4 import QtGui, QtCore

app = QtGui.QApplication(sys.argv)

combobox = QtGui.QComboBox()

data = []
data.append("one")
model = QtGui.QStringListModel(data, combobox)
combobox.setModel(model)

combobox.show()

sys.exit(app.exec_())
于 2013-11-10T16:56:38.840 回答