2011-12-21 183 views
4

我已经安装了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创建。

+0

您可以显示创建'QTreeWidget'的代码部分以及您调用该函数的位置吗? – alexisdm 2011-12-21 13:39:17

+0

而不是自己计算'j',考虑更多的pythonic解决方案'对于j,元素枚举(item):'。 – 2011-12-21 13:41:59

回答

2

从与Qt的事件循环不相同的线程更新GUI元素是一个很大的禁忌。

解决此问题的常规方法是使用排队信号/插槽连接或单线程QTimer传递线程边界并在主线程上执行您的函数。