PyQt中QTreeWidget.clear()会导致崩溃

6
我已经安装了Python 2.5和PyQt 4.8.6。操作系统为Windows XP SP2。我使用以下代码填充TreeWidget:
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.addTopLevelItem(temp) 

或者
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) 

当在主窗口 init() 函数中启动时,会创建此线程:

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创建的。

你能展示一下创建 QTreeWidget 和调用该函数的代码部分吗? - alexisdm
不要自己计算 j,可以考虑更具 Python 风格的解决方法:for j, elem in enumerate(item): - Ferdinand Beyer
1个回答

3

在非Qt事件循环的线程中更新GUI元素是不可取的。

解决这个问题的惯用方法是使用队列信号/槽连接或单次定时器,通过线程边界执行你的函数在主线程上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接