PySide 将信号从 QThread 传递到另一个 QThread 中的槽

2023-12-11

我通过移动解决了我的问题mySubQThread run()进入myQThread run()

也就是说,我仍然想知道为什么我之前尝试的方法不起作用。

我对线程很陌生。我遇到了这个问题,我认为我可能处理问题的方式是错误的,无论如何。我对不同的方法持开放态度,我知道这可能有点复杂。

我有一个 GUI 可以生成新的派生QThread让我们称之为myQThread在该线程中,我正在运行一个创建另一个线程(称为它)的进程mySubQThread我遇到的问题如下,我在 GUI 中定义了信号,例如:signalA = QtCore.Signal(int)和一个插槽myQThread插槽位于mySubQThread似乎从来没有收到信号。

这是一个工作示例。 (稍作修改)

from PySide import QtCore, QtGui
import time



class myQThread(QtCore.QThread):
    myThreadSignal = QtCore.Signal(int)
    def __init__(self, parent):
        super(myQThread, self).__init__(parent=parent)

    def run(self):
        self.subThread = mySubQThread(parent=self)
        self.myThreadSignal.connect(self.subThread.sub_thread_slot)
        self.myThreadSignal.connect(self.test_slot)
        print "starting subthread..."
        self.subThread.start()

        while self.subThread.isRunning():
            print "myQThread is alive!"
            time.sleep(1)
        print "myQThread exiting run..."
    @QtCore.Slot(int)
    def my_thread_slot(self, a):
        print "1b) Made it here!"
        self.myThreadSignal.emit(a)

    @QtCore.Slot(int)
    def test_slot(self, a):
        print "2a) Made it here!"

class mySubQThread(QtCore.QThread):
    mySubSignalA = QtCore.Signal(int)
    def __init__(self, parent):
        super(mySubQThread, self).__init__(parent=parent)
        self._abort = False
    def run(self):
        #Do some processing
        #Wait for signal
        self._abort = False
        while not self._abort:
            print "mySubQThread is alive!"
            time.sleep(1)
        print "mySubQThread exiting run..."

    @QtCore.Slot(int)
    def sub_thread_slot(self, a):
        print "2b)Never make it here!"
        self._abort = True


class myWidget(QtGui.QWidget):
    myWidgetSignal = QtCore.Signal(int)
    def __init__(self, parent=None):
        super(myWidget, self).__init__(parent=parent)
        #simple Widget to test this out....
        myLayout = QtGui.QVBoxLayout()
        self.runButton = QtGui.QPushButton("run")
        self.runButton.clicked.connect(self.run_button_pressed)

        self.otherButton = QtGui.QPushButton("other")
        self.otherButton.clicked.connect(self.other_button_pressed)

        myLayout.addWidget(self.runButton)
        myLayout.addWidget(self.otherButton)

        self.setLayout(myLayout)
    @QtCore.Slot()
    def run_button_pressed(self):
        self.processThread = myQThread(self)
        self.myWidgetSignal.connect(self.processThread.my_thread_slot)
        self.myWidgetSignal.connect(self.test_slot)
        self.processThread.start()
    @QtCore.Slot()
    def other_button_pressed(self):
        self.myWidgetSignal.emit(1)

    @QtCore.Slot(int)
    def test_slot(self, a):
        print "1a) Made it here!"

if __name__ == "__main__":
    import sys
    myApp = QtGui.QApplication(sys.argv)
    myWin = myWidget()
    myWin.show()
    sys.exit(myApp.exec_())

这是一些示例输出:

请注意,如果更改该行:

        self.subThread = mySubQThread(parent=self)

to

        self.subThread = mySubQThread(parent=None)

它不再像示例输出中那样抱怨。两者都没有表明它能达到 2B

QObject: Cannot create children for a parent that is in a different thread.
(Parent is myQThread(0x3c3faf0), parent's thread is QThread(0x2792548), current thread is myQThread(0x3c3faf0)
starting subthread...
myQThread is alive!mySubQThread is alive!

mySubQThread is alive!
myQThread is alive!
1b) Made it here!
2a) Made it here!
1a) Made it here!

问题是因为你已经覆盖了QThread.run(). The run方法默认包含处理信号处理的实现。

如果你想正确使用信号/槽,你应该子类化QObject,将代码放入其中的方法中,然后使用moveToThread()移动QObject到一个基本实例QThread你实例化的。然后,您可以通过将您的方法连接到QThread.started发出信号然后呼叫thread.start()

然后,您可以通过将该代码放入该方法的方法中,以类似的方式重复创建子线程。QObject先前在线程中创建并启动。您连接的信号和槽将在线程及其子线程之间正确生成。

This是主线程和子线程之间正确通信的一个很好的例子QThread,但您可以轻松地将其扩展到QThreads。只需修改MyWorker.firstWork()启动新方法QThread就像已经完成的那样setupThread method.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PySide 将信号从 QThread 传递到另一个 QThread 中的槽 的相关文章

随机推荐

  • .net core类库调用.net Framework类库

    无法找到我的疑问的答案 希望有人能澄清 我创建了一个虚拟解决方案 1个类库 net框架 1 net核心库 试图参考任何一种方式 但我不能 它们不兼容 罚款是有道理的 现在我的问题 我有一个实用类库 net 框架 带有扩展 助手等 winfo
  • C# - 在背景图像上绘制顶部图像(alpha 通道) - WinForm

    我已经得到了这个带有 alpha 通道的顶部图像 我需要将此图像放在另一个背景图像上 而顶部图像的 alpha 通道显然保持完整 现在我已经看到了一些关于 Canvas 的教程 但我的项目似乎无法识别 Canvas 有人知道为什么我不能使用
  • 初始化条带变量后如何更改条带区域设置

    我正在使用条纹TypeScript应用程序 我读到可以使用如下语言环境设置 stripe 变量 var stripe Stripe pk test locale en 但如果我想在初始化后更改语言 我无法做到这一点 我想创建一个新的 str
  • 是否可以使用 SSH.NET 从单个登录会话执行多个 SSH 命令?

    我将 C 与 SSH NET 结合使用 并且能够使客户端 SSH 连接正常工作 以便通过 SSH 执行命令 我可以毫无问题地连接到虚拟机管理程序虚拟机上安装的 Linux 请读回StdOut and StdErr etc 然而 每个命令就像
  • 使用 Windows 服务进行屏幕截图

    即使有很多关于这个问题的问题 我也找不到合适的解决方案 我正在创建 Windows 服务来捕获屏幕 Windows 7 我尝试使用 Windows 应用程序 它工作正常 当我要启动该服务时 它说我无法启动该服务 当我检查 Windows 日
  • 单击图表时获取 X 轴值 - Excel VBA

    我遇到了一个奇怪的需求 当用户单击图表区域时 我需要从图表中获取 X 轴值 我知道我们可以为图表分配一个宏 这样 就可以创建图表的事件 但不知道如何进一步进行 请问有什么想法吗 Thanks 如果您的图表位于图表工作表中 则可以右键单击图表
  • “[变量] 在定义之前已被使用”错误

    我有几个这样的错误 我不知道如何 正确 解决它 问题是我有很多 javascript 文件 分开以便于维护 并且我包含插件等 所以在这个例子中我使用来自的快捷方式http www openjs com scripts events keyb
  • 删除缺失值超过阈值的行缺失值[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我有一个带有一些缺失值的矩阵 A lt array c 1 NA 3 NA 4 5 7 NA 2 dim c 3 3 我可以使用删除所有具有缺失值的行 B lt na omi
  • Applescript 使用特定库启动 iTunes

    我想编写一个 AppleScript 它允许我使用给定的库启动 iTunes 而不必按住 Option 键并浏览某个库 我已经知道道格的图书馆经理 但这并不是我想要的 AppleScript 将用于特定的库 iTunes 不允许您使用 Ap
  • 避免身份列中的空白

    我有一张桌子在MS SQL SERVER 2008我已经设置了它primary key自动递增 但如果我从此表中删除任何行并在表中插入一些新行 它将从下一个标识值开始 这会在标识值中创建间隙 我的程序要求所有身份或密钥按顺序排列 喜欢 分配
  • JavaScript 使用过滤器和循环从数组中删除多个值

    我是新来的 需要一些编写函数的帮助destroyer 从数组中删除多个值 destroyer 函数传入一个数组和附加数字作为参数 这个想法是从数组中删除数字 E g destroyer 1 2 3 1 2 3 2 3 Output 1 1
  • 如何转换Big Endian以及如何翻转最高位?

    我正在使用 TStream 读取二进制数据 感谢这篇文章 如何使用 TFileStream 将二维矩阵读入动态数组 我的下一个问题是数据是大端字节序 根据我的阅读 Swap 方法似乎已被弃用 我如何交换以下类型 16 bit two s c
  • 为ARM处理器编译基本C文件

    我正在使用 GCC 工具链的 Yagarto 重新编译 我正在尝试编译这个简单的程序以获得 elf可执行文件 int main void return 0 当输入命令时arm none eabi gcc main c我收到错误消息 c ya
  • 类型错误:无法在“URL”上执行“createObjectURL”:未找到与提供的签名匹配的函数

    我有一个 Angular 8 应用程序 我用 jasmine karma 做了一些单元测试 这是 component ts export class DossierPersonalDataComponent implements OnIni
  • 如何在 IndexedDB 中保存对象?

    我想将我的API数据存储在浏览器的indexedDB中 我本想尝试本地存储 但它的限制为 5MB 但我的 JSON 数据超过 7MB 我想保存在indexedDB中以便更快地访问 我想以 JSON 格式保存整个数据 但不知道如何设置索引数据
  • Java Tab顺序:如何在java swing表中设置Tab顺序

    我是 java 语言新手 我想在其中设置制表符顺序JTable在java摇摆中 我们如何在java swing中设置Tab顺序 我假设您指的是 FocusTraversalPolicy 不确定这是否很容易在 JTable 内部处理 但是这里
  • 为什么在等待方法之后的代码中没有使用初始线程?

    我不明白使用 async await 时如何将控制返回给调用者 因为当我执行此代码时 第一个线程在等待方法内调用任务时实际上被销毁 并且给出结果的线程执行所有剩余代码下面我也画了一个我认为执行的图 但似乎是错误的 根据 将控制权返回给调用者
  • Python 中的方法解析顺序

    我是Python新手 我正在使用 Python 2 7 我正在使用一个小片段来完成方法顺序解析 如下所示 class A object attr A class B A pass class C A attr C class D B C p
  • 使用 objshell.run 时找不到文件 -- vbscript

    当我尝试运行脚本时 它会抛出文件不存在的错误 在脚本上它确实回显文件存在 曾尝试过 objshell run apppath 但没有运气 请帮忙 Set objFSO CreateObject Scripting FileSystemObj
  • PySide 将信号从 QThread 传递到另一个 QThread 中的槽

    我通过移动解决了我的问题mySubQThread run 进入myQThread run 也就是说 我仍然想知道为什么我之前尝试的方法不起作用 我对线程很陌生 我遇到了这个问题 我认为我可能处理问题的方式是错误的 无论如何 我对不同的方法持