2

我有以下代码:

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班级用户已经输入了文本并单击了 OK 按钮?我尝试连接该anotherSig信号,但是当我尝试这样做时,Qt 抱怨 QPixmaps 从不同的线程设置不安全,并且它不起作用。

我在这里使用的方法“有效”,但我觉得它不是很可靠。另外,它仅在Functions类中的所有相关方法都有效时才有效@classmethod- 这样,由于某种原因,它不起作用。被setResult调用(我添加了一个print声明以确保),但grabResult仍然显示self.resultNone.

4

2 回答 2

0

使用time.sleep会导致您的应用程序冻结。让你的班级等待的一种方法是QEventLoop这样使用:

loop = QEventLoop()
myDialog.mySignal.connect(loop.quit)
loop.exec_() 
于 2012-12-23T22:06:49.363 回答
0

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

要将结果移回原始Functions对象,我认为您需要将对象连接到要获取结果anotherSigDialog对象上的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))
于 2012-12-04T05:33:44.143 回答