pyqt中GUI的模型视图实现出错

时间:2013-11-10 08:39:51

标签: python user-interface pyqt qcombobox qstringlistmodel

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

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_())

我发现这是关于使用模型但我不知道如何解决它。

编辑: os:赢得7 64位 PyQt4的

1 个答案:

答案 0 :(得分:5)

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

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

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

另一种更强大的解决问题的方法是确保QStringListModel有一个父级,因为当Qt传递给组合框时,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_())