2013-11-10 35 views
1

下面的示例代码与此错误崩溃GUI的模型视图FPGA实现,当我关闭应用程序:错误的PyQt的

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

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

编辑: 操作系统:赢得7 64位 PyQt4的

+0

无法重现,请提供有关Python,Qt和PyQt版本以及操作系统的信息。 –

回答

3

该程序是不是“崩溃”:它在正常关机过程仅打印错误消息。

消息显示的原因是垃圾收集的副作用。当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_())