Python PySide:以新语法从QThread发出信号
我正在尝试(和研究)将一个信号从一个工作的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
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!')