【问题标题】:PyQt QTreeWidget.clear() causes crashPyQt QTreeWidget.clear() 导致崩溃
【发布时间】:2012-01-25 07:15:49
【问题描述】:

我已经安装了 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 的代码部分以及调用该函数的位置?
  • 与其自己计算j,不如考虑更pythonic的解决方案for j, elem in enumerate(item):

标签: python qt crash pyqt qtreewidget


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 2018-01-23
    • 2020-12-02
    • 2013-11-11
    • 2011-01-24
    • 2015-02-23
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多