我有以下代码:
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.result
为None
。
答案 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_()