我有一个 QTreeWidget 需要填充大量信息。所以我可以设计它并按照我真正想要的方式设置它,我决定创建一个 QWidget,它的风格和穿着都非常漂亮。然后,我将使用通用 TreeWidgetItems 填充 TreeWidget,然后使用 setItemWidget 将自定义 QWidgets 粘贴在树中。这在主 PyQt 线程中调用 QWidgets 时有效,但由于信息量很大,我想在线程中创建和填充 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 类作为父级?提前致谢。