大量の情報を入力する必要があるQTreeWidgetがあります。スタイリングして自分の思い通りにセットアップできるように、すべてきれいにスタイリングしてドレスアップしたQWidgetを作成することにしました。次に、TreeWidgetに汎用TreeWidgetItemsを設定し、setItemWidgetを使用してカスタムQWidgetsをツリーに固定します。これは、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クラスを適切に親にするにはどうすればよいですか?前もって感謝します。