PyQt QTreeWidget.clear()导致崩溃
问题描述:
我已经安装了python 2.5和PyQt 4.8.6。 Os - Windows Xp Sp2。我使用以下代码填充TreeWidget:PyQt QTreeWidget.clear()导致崩溃
def updateTreeWidget(self, widget, results):
""" Updates the widget with given results """
widget.clear()
for item in results:
temp = QtGui.QTreeWidgetItem()
j = 0
for elem in item:
temp.setText(j , str(elem))
j += 1
widget.addTopLevelItem(temp)
for column in range(widget.columnCount()):
widget.resizeColumnToContents(column)
它在第二次使用时会导致崩溃。如果我注释掉以下行之一:
或
widget.clear()
它的工作原理没有问题。
我每60秒调用一次线程中的函数。这里是MyThread类的定义。
class MyThread(threading.Thread):
def __init__(self, db, widget, function, script, parameter):
threading.Thread.__init__(self)
self.db = db
self.function = function
self.script = script
self.parameter = parameter
self.widget = widget
self.event = threading.Event()
def run(self):
while 1:
self.event.wait(60)
parameter = [getCurrentTimeStr()] + self.parameter
res = self.db.getQuery(self.script % tuple(parameter))
self.function(self.widget, res)
该线程启动时初始化主窗口():
class MainWnd(QtGui.QMainWindow):
def __init__(self, parent = None):
# some code
self.db = DbAccess()
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_mainWnd()
self.ui.setupUi(self)
self.thread = MyThread(self.db, self.ui.treeWidget, self.updateTreeWidget, self.script, self.param)
self.thread.start()
小部件是使用Qt Designer创建。
答
从与Qt的事件循环不相同的线程更新GUI元素是一个很大的禁忌。
解决此问题的常规方法是使用排队信号/插槽连接或单线程QTimer传递线程边界并在主线程上执行您的函数。
您可以显示创建'QTreeWidget'的代码部分以及您调用该函数的位置吗? – alexisdm 2011-12-21 13:39:17
而不是自己计算'j',考虑更多的pythonic解决方案'对于j,元素枚举(item):'。 – 2011-12-21 13:41:59