从要插入QTreeWidg的QThread生成的QWidgets的正确父子关系

2024-10-06 16:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个QTreeWidget,它需要填充大量的信息。为了让我可以按照我真正想要的方式来设计它,我决定创建一个QWidget,它的样式和穿着都很像。然后,我将用通用的TreeWidgetItems填充TreeWidget,然后使用setItemWidget将定制的qwidget粘贴到树中。当QWidgets在主PyQt线程中被调用时,这是可行的,但是由于有大量的信息,我想在线程中创建并填充QWidgets,然后在它们全部填充完毕之后将它们发送到主线程中。然而,当我这样做时,QWidgets似乎没有让它们的父母正确设置,因为它们都是在自己的小窗口中打开的。下面是重新创建此问题的一些示例代码:

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class ItemWidget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        btn = QPushButton(self)

class populateWidgets(QThread):
    def __init__(self):
        QThread.__init__(self)

    def run(self):
        widget = ItemWidget()
        for x in range(5):
            self.emit(SIGNAL("widget"), widget)

class MyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)

        self.tree = QTreeWidget(self)
        self.tree.setColumnCount(2)
        self.setCentralWidget(self.tree)

        self.pop = populateWidgets()
        self.connect(self.pop, SIGNAL("widget"), self.addItems)
        self.pop.start()

        itemWidget = QTreeWidgetItem()
        itemWidget.setText(0, "This Works")
        self.tree.addTopLevelItem(itemWidget)
        self.tree.setItemWidget(itemWidget, 1, ItemWidget(self))        

    def addItems(self, widget):
        itemWidget = QTreeWidgetItem()
        itemWidget.setText(0, "These Do Not")
        self.tree.addTopLevelItem(itemWidget)
        self.tree.setItemWidget(itemWidget, 1, widget)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    ui = MyMainWindow()
    ui.show()
    sys.exit(app.exec_())

如您所见,在MyMainWindow中执行该操作是很好的,但是一旦在线程中处理并返回,就会出现问题。这有可能吗?如果是这样,如何在QTreeWidgetItem中正确地为ItemWidget类建立父级?提前谢谢。在


Tags: importselftreeinitdefwidgetpopclass
1条回答
网友
1楼 · 发布于 2024-10-06 16:25:20

AFAICT Qt不支持在QApplication对象被实例化的线程(通常是main()线程)之外的线程中创建QWidgets。以下是一些关于这个主题的帖子,来自Qt开发者的回复:

http://www.qtcentre.org/archive/index.php/t-27012.html

http://www.archivum.info/qt-interest@trolltech.com/2009-07/00506/Re-(Qt-interest)-QObject-moveToThread-Widgets-cannot-be-moved-to-a-new-thread.html

http://www.archivum.info/qt-interest@trolltech.com/2009-07/00055/Re-(Qt-interest)-QObject-moveToThread-Widgets-cannot-be-moved-to-a-new-thread.html

http://www.archivum.info/qt-interest@trolltech.com/2009-07/00712/Re-(Qt-interest)-QObject-moveToThread-Widgets-cannot-be-moved-toa-new-thread.html

(如果可能的话,方法是从主线程内部调用QWidgets上的moveToThread(),将它们移动到主线程,但显然这种技术并不可靠,因为QtCore对试图这样做的人进行检查,并向stdout发出警告,告诉他们不要这样做)

相关问题 更多 >