无法从pyqt中的非线程插槽发出信号

时间:2018-02-15 14:09:44

标签: python pyqt5

根据这个例子:link,我想在GUI中实现一个基于线程的小应用程序。我有两个文件TestMain.pyTestManager.py(工作者类),它们通过sys.path.append('...')相互连接。在TestMain.py中,我加载了我的GUI,创建了线程和信号/插槽连接,这些连接作用于TestManager.py中的函数。在TestManager.py我做了一些计算,并希望同时在QTextEditor中对它们进行可视化。为此,我编写了以下代码:

TestMain.py

sys.path.append('../app/source')
from TestManager import *

class TestMain(QMainWindow):
    def __init__(self, parent= None):
        super(TestMain, self).__init__(parent)

        self.manager= TestManager()
        self.thread= QThread()
        self.manager.moveToThread(self.thread)

        self.manager.finished.connect(self.thread.quit)
        self.thread.started.connect(self.manager.first_slot)
        self.thread.start()

        self.manager.printFirstSignal.connect(self.print_onTextEdit)

        self.offlinePushButton.clicked.connect(self.offline_slot)

    def offline_slot(self):
        manager.do_some_calc(self)

    def print_onTextEdit(self, str):
        self.outputTextEdit.append(str)

Manager.py

sys.path.append('../app/source')
from TestMain import *

class TestManager(QObject): #QtCore.QThread
    finished= pyqtSignal()
    printFirstSignal= pyqtSignal(str)

    def __init__(self, parent= None):
        super(TestManager, self).__init__(parent)

    def first_slot(self):
        self.printFirstSignal.emit('TEST')
        self.finished.emit()

    def do_some_calc(self):
        do_someting()
        TestManager.first_slot("do_some_calc")

如果我在self.thread.started.connect(self.manager.first_slot)TestMain并在pyqtSignal中的first_slot()中发出TestManager,那么我可以毫无问题地更新我的GUI。但是如果我在do_some_calc()中调用一个插槽(例如TestManager)并且想要从那里更新GUI,那么我就会遇到分段错误。即使我为此功能创建单独的信号,它也不起作用。因为我在TestMain self.offlinePushButton.clicked.connect(self.offline_slot)

中调用此函数

我的问题是。如何在TestManager内部或MainTest调用任何函数,以便我仍然可以更新GUI?

感谢您提出任何建议

0 个答案:

没有答案