首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PyQt5:如何向工作线程发送信号

PyQt5:如何向工作线程发送信号
EN

Stack Overflow用户
提问于 2016-12-07 19:44:36
回答 1查看 4.5K关注 0票数 4

我知道如何将信号从工作线程发送回主GUI线程,但是如何将信号从主线程发送到工作线程?

下面是一些示例代码,其中包含一个信号和插槽。在这里,我正在向主线程发送信号,但是我如何才能向相反的方向前进呢?

这里的目标是在我想要线程停止时发送一个信号,将self.do的值更改为0。

下面是主文件,我将把UI文件放在下面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QThread, QObject, pyqtSignal, pyqtSlot
from progressUI import Ui_Form

import sys
import time

class ProgressBar(QObject):
    progress = pyqtSignal(int)
    kill = pyqtSignal()

    def __init__(self, timer, parent=None):
        super(ProgressBar, self).__init__(parent)
        self.time = timer
        self.do = 1

    def work(self):

        while self.do == 1:
            y = 0
            for _ in range(100):
                time.sleep(.1)
                y += 1
                self.progress.emit(y)
            break

        self.kill.emit()

    @pyqtSlot(str)
    def worker_slot(self, sentence):
        print(sentence)

class Go(QMainWindow, Ui_Form, QObject):
    custom_signal = pyqtSignal(str)

    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.progressBar.setValue(0)
        self.startThread()

    @pyqtSlot(int)
    def updateProgress(self, val):
        self.progressBar.setValue(val)
        self.custom_signal.emit('hi from main thread')

    def startThread(self):
        self.progressThread = ProgressBar(60)
        self.thread = QThread()
        self.progressThread.moveToThread(self.thread)

        self.progressThread.progress.connect(self.updateProgress)
        self.progressThread.kill.connect(self.thread.quit)
        self.custom_signal.connect(self.progressThread.worker_slot)
        self.thread.started.connect(self.progressThread.work)

        self.thread.start()



if __name__ == '__main__':
     app = QtWidgets.QApplication(sys.argv)
     MainApp = Go()
     MainApp.show()
     sys.exit(app.exec_())

这是UI文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(658, 118)
        self.progressBar = QtWidgets.QProgressBar(Form)
        self.progressBar.setGeometry(QtCore.QRect(30, 40, 601, 23))
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(45, 75, 581, 26))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "TextLabel"))
EN

回答 1

Stack Overflow用户

发布于 2016-12-08 11:29:03

如何向工作线程发送信号?与从工作线程向GUI发送信号的方式完全相同。我希望它会有更多的不同。

@three-pineapples链接到主线程和辅助线程之间双向通信的优秀示例。

如果您希望在主GUI线程中创建自定义信号,则需要确保继承QObject,然后才能创建自定义信号。

我更新了原始post中的代码以包含UI文件,以便您可以运行它,并且在GUI线程中包含了一个向worker发送信号的自定义信号的示例。

但是,在for循环结束之前,您将看不到print语句的输出,因为它会阻止worker处理信号,就像@three-pineapple还声明的那样。

因此,尽管这不是最好的例子,但希望如果有人在理解这个概念时遇到了同样的问题,也许这会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41026032

复制
相关文章
arch linux 安装
好长时间都没有更新自己的博客了,我简单翻阅了一下自己的更新记录,上一次更新好像还是在5月份左右,距今也有快半年,这半年也是遇到了很多事情,有不好的,也有好的。这半年我对在日常生活工作中使用Linux系统产生了一些兴趣,从零开始折腾这一系列的内容,主要从安装、配置、以及尝试各种软件来取代Windows的主导地位,也产生了一些心得,这里我想分几篇博客来聊聊我是如何慢慢使用arch Linux 来替代以前的Windows机器
Masimaro
2021/10/20
2.7K0
ARM 和 龙芯上 Arch Linux 安装手记
今天尝试安装龙芯版 Linux,本来希望能安装 Debian 版,但只找到一些文档(https://wiki.debian.org/LoongArch),没找到可安装版的 ISO。
杜金房
2024/03/26
5110
ARM 和 龙芯上 Arch Linux 安装手记
Arch Linux安装MariaDB
Archlinux上安装MySQL/MariaDB和其它发行版略有不同,因此这里梳理记录一下 执行常规安装 [mu@mu polls]$ sudo pacman -S mariadb #安装MariaDB [mu@mu polls]$ sudo systemctl enable mariadb #设置开机自启 Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/syste
用户1456517
2019/03/05
3.3K0
Arch Linux安装MariaDB
Arch Linux 安装指南
如果想要学习Linux,Arch Linux是个很好的选择。Arch Linux提供了非常详细并且更新及时的Wiki(帮助文档),使用系统的过程中遇到的问题基本上都空余从上面找到。
小陈运维
2021/10/13
2.6K0
如何在 Linux 上安装 Java
无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序,或者使用 Fedora 上的 DNF 或 Mac 上的 Brew 这样的软件包管理器进行安装,而有时你可能会从网站上下载可执行文件或安装程序。因为 Java 是这么多流行的应用程序的后端,所以最好了解安装它的不同方法。好消息是你有很多选择,本文涵盖了所有这些内容。
用户1880875
2021/09/22
3.1K0
如何在Linux上安装OpenCV
更新系统:在终端中输入 sudo apt-get update 和 sudo apt-get upgrade 以更新您的系统。
云帆沧海
2024/01/17
8710
Arch Linux安装与初体验
Arch Linux 是一个 x86-64 通用发行版,它流行于那些喜欢 DIY Linux 系统的用户和 Linux铁杆粉丝当中。其默认的安装文件只含有一个最基本的系统,它希望使用者自己配置并使用 Arch 系统。其基于 KISS 原则(使它保持简单、傻瓜Keep It Simple, Stupid!),Arch Linux 是一个专注于优雅、代码正确,精简而简洁的系统。
yuanfan2012
2021/02/25
2.7K0
Arch Linux安装与初体验
Arch Linux 安装初体验:EndeavourOS
最近在玩 LFS,看到一个老外使用 EndeavourOS 来玩耍!于是,我也来安装体验一把!
Lucifer三思而后行
2021/09/23
4.5K0
如何在 Fedora Linux 上安装 VLC
如果你刚刚安装了 Fedora,现在想在上面安装你最喜欢的视频播放器 VLC,你可能不会在软件中心找到它。至少不会立即找到。
用户1880875
2021/09/08
2.4K0
实战最精简的 linux -- arch linux 安装
安装操作系统已经越来越成为一件非常简单的事情了,几乎可以做到仅依靠鼠标一路点击,傻瓜式安装了,也许这让你不禁会去想,到底操作系统安装过程中做了哪些事情,亦或是你想要安装一个真正干净的系统,一切组件要什么不要什么都自己说了算,那么,arch linux 可能会是你一个不错的选择。 正是因为 arch 的高度定制与简洁,加上他的滚动升级机制以及庞大的社区 AUR,让他成为了越来越火热的 linux 发行版,本文,我们就来通过安装 arch 讲解一下 linux 的一些基本的命令行配置方法。
用户3147702
2022/06/27
7.5K0
实战最精简的 linux -- arch linux 安装
如何在Pacman (Arch Linux)中用Configuration设置HTTP?
首先,确定HTTP爬虫服务器的IP地址和端口。在这个例子中,我们将使用一个免费的HTTP爬虫服务器:getproxy。
华科云商小徐
2023/10/26
2310
VMware安装Arch Linux+Gnome桌面
官方下载地址:https://www.archlinux.org/download/。
Mculover666
2022/04/08
15.4K0
VMware安装Arch Linux+Gnome桌面
Linux 命令(161)—— adduser 命令
adduser 命令用于创建的新的系统用户。adduser 可用来建立用户帐号。帐号建好之后,再用 passwd 设定帐号的密码。而可用 userdel 删除帐号。使用 adduser 指令所建立的帐号,实际上是保存在 /etc/passwd 文本文件中。
恋喵大鲤鱼
2022/10/30
1.7K0
如何在CentOS Linux 7.5上安装Nginx
Nginx发音引擎x是一个免费的开源高性能HTTP和反向代理服务器,负责处理互联网上一些最大的网站的负载。 本教程将教你如何在你的CentOS Linux 7.5机器上安装和管理Nginx。
星哥玩云
2022/07/13
1.6K0
如何在CentOS Linux 7.5上安装Nginx
如何在 Linux Mint 21 上安装 MongoDB
MongoDB 是一个非常流行的 NoSQL 数据库,可以在 Linux 和 Windows 操作系统上使用。它将数据存储在类似 JSON 的文档中,具有高度的灵活性和动态性,因此可用于创建强大的应用程序和网站,并使其与传统的关系数据库有根本的不同。
帝旭科技
2022/11/23
7.6K0
如何在 Linux Mint 21 上安装 MongoDB
如何在 Debian 10 Linux 上安装 Nginx
Nginx 是一个开源,高性能的 HTTP 和反向代理服务器,为 Internet 上的一些最大的站点提供支持。与 Apache 相比, Nginx 可以处理大量并发连接,并且每个连接的内存占用量更小。
星哥玩云
2022/07/28
2.8K0
如何在 Alma Linux 8 上安装 GitLab?
GitLab 是一款免费的开源 DevOps 软件,它附带多种工具,可在单个应用程序中开发、保护和操作软件。它提供免费的无限存储库和无限的协作者。它主要用于托管 Git 存储库,并具有其他与开发相关的功能,例如问题跟踪。它与 Github 和 Bitbucket 非常相似,允许个人和团队与他人远程共享代码。
网络技术联盟站
2022/04/07
1.4K0
如何在 Alma Linux 8 上安装 GitLab?
如何在 Debian 10 Linux 上安装MySQL
MySQL 是世界上最流行的开源关系数据库管理系统,而 MariaDB 是 Debian 10 中的默认数据库系统, Mysql 并不包含在 Debian 的默认软件存储库。
星哥玩云
2022/08/18
2.9K0
如何在 Debian 10 Linux 上安装MySQL
如何在Linux上安装Node.js
版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog.csdn.net/wh211212/article/details/53039286
shaonbean
2019/05/26
2.4K0
如何在 Rocky Linux 8 上安装 Mattermost
Mattermost 是一个开源的、自托管的 Slack 替代方案,无需依赖第三方供应商,意味着您可以在自己的基础架构中托管数据。
网络技术联盟站
2021/11/19
1.3K0

相似问题

如何调整DBGrid - Delphi的行高

19

Delphi中DBGrid中的列高

11

更改DBGrid行的颜色

12

Delphi访问DBGrid的行

22

DBGrid,dbf合并2行

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文