1

大量の情報を入力する必要がある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クラスを適切に親にするにはどうすればよいですか?前もって感謝します。

4

1 に答える 1

1

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に出力します)

于 2012-06-14T15:47:31.717 に答える