5

別のスレッドからメイン レイアウトを変更しようとしています。しかし、関数 run() は呼び出されず、エラーが発生しています:

QObject::setParent: 親を設定できません。新しい親は別のスレッドにあります

これが私のコードです:

class FeedRetrievingThread(QtCore.QThread):
    def __init__(self, parent=None):
        super(FeedRetrievingThread, self).__init__(parent)
        self.mainLayout = parent.mainLayout
    def run(self):
        # Do things with self.mainLayout

class MainWindow(QtGui.QDialog):
    def __init__(self, parent=None):  
        super(MainWindow, self).__init__(parent)
        self.mainLayout = QtGui.QGridLayout() 
        self.setLayout(self.mainLayout)  
        self.feedRetrievingThread = FeedRetrievingThread(self)
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.updateFeed)
        self.timer.start(1000)

    def updateFeed(self):
        if not self.feedRetrievingThread.isRunning():
            print 'Running thread.'
            self.feedRetrievingThread.start()

if __name__ == '__main__':  
    app = QtGui.QApplication(sys.argv)  
    mainWindow = MainWindow()  
    mainWindow.show()
    sys.exit(app.exec_())

なぜ PyQt で GUI にアクセスするのが難しいのですか? C# には Invoke があります。PyQtにそのようなものはありますか?

MainWindow.__init__(タイマーを使用せずに)スレッドを直接作成しようとしましたが、うまくいきませんでした。

4

1 に答える 1

7

Qt では、GUI スレッドの外部から GUIを直接更新しようとしないでください。

代わりに、スレッドにシグナルを発行させ、それらを GUI スレッド内から必要な更新を行うスロットに接続します。

Threads と QObjectsに関する Qt のドキュメントを参照してください。

于 2012-11-16T18:41:51.143 に答える