Python PySide信号未从QThread对象发送到插槽

Python PySide信号未从QThread对象发送到插槽,python,multithreading,pyside,qt-signals,qt-slot,Python,Multithreading,Pyside,Qt Signals,Qt Slot,我正在使用一个多线程应用程序,其中创建了一个工作线程,它会发出一个信号。 创建线程后,我将信号与一个对象插槽连接,该插槽将执行一些操作 问题是,没有调用对象槽,有人能帮助找出这段代码的错误吗 导入时间 从PySide导入QtCore 从PySide.QtCore导入插槽,信号 类Worker1(QtCore.QThread): 任务完成信号=信号(int) 定义初始化(自): 超级(工作1,自我)。\uuuu初始化 self.\u run=False def运行(自): self._loop()

我正在使用一个多线程应用程序,其中创建了一个工作线程,它会发出一个信号。 创建线程后,我将信号与一个对象插槽连接,该插槽将执行一些操作

问题是,没有调用对象槽,有人能帮助找出这段代码的错误吗

导入时间
从PySide导入QtCore
从PySide.QtCore导入插槽,信号
类Worker1(QtCore.QThread):
任务完成信号=信号(int)
定义初始化(自):
超级(工作1,自我)。\uuuu初始化
self.\u run=False
def运行(自):
self._loop()
def_回路(自):
计数=0
自我运行时:
打印(“运行”)
计数+=1
self.task\u done\u signal.emit(计数)
def启动(自):
self.\u run=True
super(Worker1,self).start()
def停止(自):
self.\u run=False
类Worker1Listener(QtCore.QObject):
定义初始化(自):
超级(Worker1Listener,self)。\uu初始化
@槽()
def打印任务(自我,val):
打印(“侦听器:{}”。格式(val))
def test_信号_和_线程()
#创建线程
worker=Worker1()
#创建侦听器
listener=Worker1Listener()
#将螺纹信号与插槽连接
worker.task\u done\u signal.connect(listener.print\u任务)
worker.start()
时间。睡眠(5)
工人停止
时间。睡眠(5)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
测试_信号_和_线程()

您的代码有几个错误:

  • 您必须有一个事件循环,以便Qt处理应用程序的各种对象之间的通信,在您的情况下,您必须使用
    QCoreApplication

  • 装饰器
    Slot
    必须将函数参数的数据类型作为参数,在您的情况下:
    Slot(int)

  • 您不应该使用time.sleep,因为它是阻塞的,不允许事件循环执行其工作,一个可能的解决方案是在
    QTimer
    旁边使用
    QEventLoop

  • 建议总是给通信留出一段短时间,为此我们使用
    QThread.msleep

  • 在不同线程中的信号之间进行连接时,正确的选项是使用
    Qt.QueuedConnection
    选项



您的代码有几个错误:

  • 您必须有一个事件循环,以便Qt处理应用程序的各种对象之间的通信,在您的情况下,您必须使用
    QCoreApplication

  • 装饰器
    Slot
    必须将函数参数的数据类型作为参数,在您的情况下:
    Slot(int)

  • 您不应该使用time.sleep,因为它是阻塞的,不允许事件循环执行其工作,一个可能的解决方案是在
    QTimer
    旁边使用
    QEventLoop

  • 建议总是给通信留出一段短时间,为此我们使用
    QThread.msleep

  • 在不同线程中的信号之间进行连接时,正确的选项是使用
    Qt.QueuedConnection
    选项



您没有运行事件循环。您没有运行事件循环。我已经阅读并创建了一个“app=QtCore.QCoreApplication(sys.argv)”,但永远不会到达您的解决方案,谢谢@eyllansc!!我读了又读,创建了一个“app=QtCore.QCoreApplication(sys.argv)”,但永远不会找到您的解决方案,谢谢@eyllansc!!
import sys

from PySide import QtCore

class Worker1(QtCore.QThread):
    task_done_signal = QtCore.Signal(int)

    def __init__(self):
        super(Worker1, self).__init__()
        self._run = False

    def run(self):
        self._loop()

    def _loop(self):
        count = 0
        while self._run:
            print("running")
            count += 1
            self.task_done_signal.emit(count)
            QtCore.QThread.msleep(1)

    def start(self):
        self._run = True
        super(Worker1, self).start()

    def stop(self):
        self._run = False


class Worker1Listener(QtCore.QObject):
    @QtCore.Slot(int)
    def print_task(self, val):
        print("listener: {}".format(val))

def test_signals_and_threads():
    app = QtCore.QCoreApplication(sys.argv)
    # create the thread
    worker = Worker1()
    # create the listener
    listener = Worker1Listener()

    # connect the thread signal with the slot
    worker.task_done_signal.connect(listener.print_task, QtCore.Qt.QueuedConnection)

    worker.start()

    loop = QtCore.QEventLoop()
    QtCore.QTimer.singleShot(5000, loop.quit)
    loop.exec_()

    worker.stop()

    loop = QtCore.QEventLoop()
    QtCore.QTimer.singleShot(5000, loop.quit)
    loop.exec_()

    #sys.exit(app.exec_())

if __name__ == '__main__':
    test_signals_and_threads()