Python PySide:以新语法从QThread发出信号

Python PySide:以新语法从QThread发出信号,python,pyside,qthread,Python,Pyside,Qthread,我正在尝试(和研究)将一个信号从一个工作的Qthread发送到主窗口,但收效甚微。我似乎不明白我应该如何用新的语法来处理这个问题 这里有一个简单的例子 from PySide.QtCore import * from PySide.QtGui import * import sys import time class Dialog(QDialog): def __init__(self, parent=None): super(Dialog, self).__init

我正在尝试(和研究)将一个信号从一个工作的Qthread发送到主窗口,但收效甚微。我似乎不明白我应该如何用新的语法来处理这个问题

这里有一个简单的例子

from PySide.QtCore import *
from PySide.QtGui import *
import sys
import time

class Dialog(QDialog):

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

        button = QPushButton("Test me!")

        layout = QVBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

        #self.button.clicked.connect(self.test) ----> 'Dialog' object has no attribute 'button'
        self.connect(button, SIGNAL('clicked()'), self.test)
        self.workerThread = WorkerThread()


    def test(self):
        self.workerThread.start()
        QMessageBox.information(self, 'Done!', 'Done.')


class WorkerThread(QThread):

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

    def run(self):
        time.sleep(5)
        print "Thread done!"


app = QApplication(sys.argv)
dialog = Dialog()
dialog.show()
app.exec_()
我知道,如果没有其他线程,我会在对话框类中创建信号,并在
\uuuu init\uuuu
中连接它,但如何创建可以从WorkerThread发出并用于test()的自定义信号

作为一个附带问题。您可以看到它在代码中注释掉了连接信号错误的新语法。在我的配置中有什么吗

我在OsX El Capitan上,Python 2.7

非常感谢您的帮助!非常感谢


TL:DR:我想在5秒后从WorkerThread发出一个信号,这样测试函数只有在WorkingRead使用新语法完成后才会显示QMessageBox。

好的,这是一个漫长的一天试图弄清楚。我的主要资源是:

在新语法中,为了处理来自不同线程的信号,必须为信号创建一个类,如下所示:

class WorkerThreadSignal(QObject):
    workerThreadDone = Signal()
WorkerThread的最终外观如下:

class WorkerThread(QThread):

    def __init__(self, parent=None):
        super(WorkerThread, self).__init__(parent)
        self.workerThreadSignal = WorkerThreadSignal()

    def run(self):
        time.sleep(3)
        self.workerThreadSignal.workerThreadDone.emit()
对于Dialog类上的连接:

    self.workerThread = WorkerThread()
    self.buttonn.clicked.connect(self.test)
以及:

因此,一旦发出信号,就会调用success方法

我花了最长时间才弄明白这最后一行代码。我原本以为可以直接连接到WorkerThreadSignal类,但至少在本例中,它只在我回溯其位置后才起作用。从对话框init到WorkerThreadinit返回WorkerThread信号。我从上面提到的网站上得到了这个提示

我发现奇怪的是,我必须在两个类上创建相同的局部变量,也许有一种方法可以创建一个全局变量,我可以引用所有当前的解决方案,但它现在可以工作

我希望这也能帮助那些陷入这个过程的人


PS:连接的语法问题也解决了。因此,所有内容都是用新语法编写的,这很好。

这个答案可能值得提出自己的问题,即为什么您试图做的事情不起作用,但我会在前面给出500个字符!信号对于对象的实例是唯一的,而不是类(即使它们被定义为类变量)。你发出了两个不同的信号,一个发射,另一个连接。显然,这不起作用!还应该做的是抛弃
WorkerThreadSignal
类,将信号移到
WorkerThread
中,这样做更简单!但是,您可能需要检查一种不同的线程方法(工作模型),它不会覆盖
QThread.run
。查看和提问(以及中的相关链接)嘿@three_菠萝,非常感谢链接和解释。在阅读了您所说的内容和其他资源之后,我开始理解使用
moveToThread()
概念的想法。我正在写我的第一个软件(在完成了一系列教程之后),所以有时候我会感到困惑。作为旁注,在
workerThread
中移动我的信号返回该对象没有属性“Signal”,我猜这是某个实例问题?如果我将信号移动到
WorkerThread
AttributeError:'PySide.QtCore.signal'对象没有属性“connect”
我刚刚实现了
moveToThread()
方法,效果非常好。我的想法有点牵强,但这样代码似乎更清晰,在需要它的函数中实现线程。非常感谢@three_Pinepples,你的回答让人大开眼界!
    self.workerThreadSignal = WorkerThreadSignal()
    self.workerThread.workerThreadSignal.workerThreadDone.connect(self.success)

def success(self):
    QMessageBox.warning(self, 'Warning!', 'Thread executed to completion!')