如何告诉类方法等待来自QDialog类方法的信号被捕获?

时间:2012-12-04 04:42:48

标签: python multithreading qt pyqt pyside

我有以下代码:

class Functions(QObject):

    mysig = Signal(filename)

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

    def showDialog(self, filename):
        self.mysig.emit(filename)

    def grabResult(self):

        while not self.result:
            time.sleep(5)

        return result #this is the question

    def setResult(self, result):
        self.result = result

代码的另一部分有:

class Dialog(QDialog):

    anotherSig = Signal(str)
    fun = Functions()

    def __init__(self, parent=None, filename=filename):
        self.filename = filename
        #Here it displays a picture based on the filename parameter

    def okButtonClicked(self):
        text = self.lineedit.text()
        fun.setResult(text)
        #Tried also this:
        self.anotherSig.emit(text)

Functions()类是从工作人员QThread调用的(此处未显示)。

我想我的问题是这样的:如何告诉我的Functions课程用户输入了文本并单击了确定按钮?我尝试连接anotherSig信号,但是当我尝试这样做时,Qt抱怨QPixmaps不能安全地从另一个线程设置,并且它不起作用。

我在这里使用的方法“有效”,但我觉得它不太可靠。另外,它只适用于Functions类中的所有相关方法都是@classmethod的情况 - 这样,由于某种原因,它不起作用。 setResult被调用(我添加了print语句以确保),但grabResult仍显示self.resultNone

2 个答案:

答案 0 :(得分:0)

此代码无效,因为showDialog的调用发生在Functions对象的实例化上,该对象是对象在另一个线程上关闭的属性。您设置结果的fun Dialog是一个不同的实例。

要将结果移回原始Functions对象,我认为您需要将anotherSig对象的Dialog连接到setResult上的Functions函数你希望得到结果的对象。

这样的事情是否有效(很难用很好的锅炉板来测试)。

class Functions(QObject):

    mysig = Signal(filename,Functions)

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

    def showDialog(self, filename):
        self.mysig.emit(filename,self)

    def grabResult(self):

        while not self.result:
            time.sleep(5)

        return result #this is the question

    @QtCore.Slot(str)
    def setResult(self, result):
        self.result = result

def connection_fun(filename,fun):
    d = Dialog(filename)
    # what ever else you do in here
    d.anotherSig.connect(fun.setResult))

答案 1 :(得分:0)

使用time.sleep会导致您的应用冻结。让您的课程等待的一种方法是使用QEventLoop,如下所示:

loop = QEventLoop()
myDialog.mySignal.connect(loop.quit)
loop.exec_()