PyQt – изменение GUI из другого потока

Я пытаюсь изменить свой основной макет из другого потока. Но функция 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? В C # вы вызываете. Есть ли что-нибудь в PyQt?

Я попытался создать поток непосредственно из MainWindow.__init__ (без использования таймера), но он тоже не работал.

В Qt вы никогда не должны пытаться напрямую обновлять графический интерфейс из-за потока GUI.

Вместо этого ваши потоки выдают сигналы и подключают их к слотам, которые выполняют необходимое обновление из потока графического интерфейса.

См. Документацию Qt относительно Threads и QObjects .