从另一个类向主类发出信号

2024-06-19

当它处于Worker 类 - def run(self) 方法。一切运行良好,while 循环能够循环并每 1 秒发出一个信号。那么标签在收到信号后就会更新。

我决定尝试将 while 循环放置在另一个名为循环 methodA 的类中。这是为了尝试看看发出的信号是否会被主窗口接收到。不幸的是,信号没有被接收到,程序随后挂断了。

我是否错过了任何阻止 while 循环发出的信号被拾取的步骤?请通过更改我的脚本来为我指明正确的方向。

Thanks.

import sys
import time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal
from mydialog import Ui_mydialog


class Mainwindow(QtWidgets.QMainWindow, Ui_mydialog):

    def __init__(self, *args, obj=None, **kwargs):
        super(Mainwindow, self).__init__(*args, **kwargs)
        self.setupUi(self)

        self.thread = Worker()
        self.loop = loop()
        self.thread.sig.connect(self.updatelabel)

        self.mypushbutton.clicked.connect(self.mypushbuttonclicked)


    def mypushbuttonclicked(self):
        self.thread.start()

    def updatelabel(self, text):
        self.mylabel.setText(text)

class Worker(QThread):

    sig = pyqtSignal(str)

    def __init__(self, parent=None):
        super(Worker, self).__init__(parent)
        # self.count = 0
        self.loop = loop()

    def run(self):

        self.loop.methodA()

        ## Original code without being in class loop and method loopA
        # while True:
        #     time.sleep(1)
        #     self.count += 1
        #     if (self.count % 1 == 0):
        #         self.sig.emit(f"Timer: {self.count} s")

# Newly added class with method "methodA"
class loop(object):

    sig = pyqtSignal(str)

    def __init__(self):
        self.count = 0

    def methodA(self):

        while True:
            time.sleep(1)
            self.count += 1
            if (self.count % 1 == 0):
                self.sig.emit(f"Timer: {self.count} s")



app = QtWidgets.QApplication(sys.argv)
window = Mainwindow()
app.setStyle("Fusion")
window.show()
app.exec()

我有类似的问题。 我通过以下方式解决了这个问题:http://zetcode.com/gui/pyqt5/eventssignals/ http://zetcode.com/gui/pyqt5/eventssignals/

这个想法是创建一个包含所有信号的类,并将相同的通信类作为参数传递给所有类。

所以你的代码可能会变成:

import sys
import time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal, QObject
from mydialog import Ui_mydialog

class Communicate(QObject):
    sig = pyqtSignal(str) 

class Mainwindow(QtWidgets.QMainWindow, Ui_mydialog):

    def __init__(self, *args, obj=None, **kwargs):
        super(Mainwindow, self).__init__(*args, **kwargs)
        self.setupUi(self)
        self.communicate = Communicate()
        self.communicate.sig[str].connect(self.updatelabel)

        self.thread = Worker(communicate = self.communicate)
        #self.loop = loop() # this seems useless to me here
        
        self.mypushbutton.clicked.connect(self.mypushbuttonclicked)


    def mypushbuttonclicked(self):
        self.thread.start()

    def updatelabel(self, text):
        self.mylabel.setText(text)

class Worker(QThread):

    def __init__(self, parent=None, communicate=Communicate()):
        super(Worker, self).__init__(parent)
        self.communicate = communicate
        # self.count = 0
        self.loop = loop(communicate= self.communicate)

    def run(self):

        self.loop.methodA()

        ## Original code without being in class loop and method loopA
        # while True:
        #     time.sleep(1)
        #     self.count += 1
        #     if (self.count % 1 == 0):
        #         self.sig.emit(f"Timer: {self.count} s")

# Newly added class with method "methodA"
class loop(object):

    def __init__(self, communicate=Communicate()):
        self.count = 0
        self.communicate = communicate

    def methodA(self):

        while True:
            time.sleep(1)
            self.count += 1
            if (self.count % 1 == 0):
                self.communicate.sig.emit(f"Timer: {self.count} s")



app = QtWidgets.QApplication(sys.argv)
window = Mainwindow()
app.setStyle("Fusion")
window.show()
app.exec()

我还没有测试过这段代码,但我希望你已经明白了。

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

从另一个类向主类发出信号 的相关文章

  • pyqt5 Qthread事件 进度条 案例

    pyqt5 Qthread事件 进度条 案例 代码 xff1a from PyQt5 import QtWidgets span class token punctuation span QtCore import sys from PyQ
  • PyQt——QThread

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQT5中 QThread 例子 39
  • Qt实现多线程编程的两种方式

    Qt实现多线程编程的两种方式 方式一 继承自QThread类 覆写run函数 此实现方法只有run函数内的代码是运行在子线程内 代码示例 ifndef QDEMOTHREAD H define QDEMOTHREAD H include
  • Qt多线程之QThread

    Qt应用运行时会自动创建一个UI线程 Qt为了防止多线程操作界面出现问题 有关界面的操作必须在UI线程中 这个线程也就是主线程 然而程序运行的时候经常会有复杂操作 若在主线中进行处理则UI界面会出现暂停卡死的现象 所以 为了良好的用户体验
  • Qt moveToThread() 与调用新线程何时使用每个

    我们什么时候在线程应用程序中使用每个函数调用 给定在同一类中定义的两个函数 fun1 和 fun2 处理数据读 写到缓冲区 队列操作 来实现多线程这些 我们必须在单独的线程中运行这两个函数 现在假设第一个函数 read 在其线程开始时被调用
  • 如何在 QThread 中运行计时器?

    我想在 QThread 内运行一个计时器 我编写了一些代码 在运行时出现一些错误 我究竟做错了什么 父级是QThread 0x1498d10 父级线程是QThread 0x11272b0 当前线程是QThread 0x1498d10 主 h
  • 为什么 PyQt 在没有信息的情况下崩溃? (退出代码 0xC0000409)

    我正在尝试使用 PyQt 开发一个软件 但我经常陷入没有调试信息的软件崩溃 只有退出代码 0xC0000409 我正在使用 QThread 并且编写了一个这样的系统 class serialThreadC QThread updateOut
  • 如何告诉 QThread 等待工作完成,然后完成?

    我有一个使用一个工作线程的简单应用程序 这个工作线程启动并初始化DownloadManager 它负责从网络下载文件 在我的主应用程序类中 我在 DownloadManager 完成之前发出的线程上有 finish 信号 我的问题是如何让工
  • QSerialPort - 等待来自发送者的完整数据

    我正在使用串行设备 QSerialPort 在一个单独的线程中 线程是这样创建的 QThread serialthread new QThread Serial serial new Serial serial gt moveToThrea
  • 在主线程之外创建 QDialog 的方法

    我正在尝试在 QT 中创建一个客户端应用程序 它需要两个线程进行处理和可变数量的窗口实例 但我很难弄清楚如何在处理线程之一内创建一个新窗口 我知道所有 ui 元素必须在与 QApplication 类相同的线程中创建 但我需要能够实例化 或
  • 从 Inherited QThread 迁移到 Worker 模型

    所以通过我之前的问题得到了很多帮助 中断QThread睡眠 https stackoverflow com questions 37119319 interrupting qthread sleep and PySide 将信号从 QThr
  • QSocketNotifier:无法从另一个线程启用或禁用套接字通知程序

    我尝试使用 QT 构建一个多线程游戏服务器 因此 每个客户端都是一个基于 QThread 的独立线程 现在我需要将数据发送到同一游戏室中的其他客户端 在其他线程中 例如 当房主关闭游戏房间时 游戏服务器需要向同一 soom 中的其他客户端发
  • Qt 5.1 中带有共享 QGLWidgets 的线程 OpenGL 问题

    我使用两个 QGLWidget 一种用于加载纹理 一种用于渲染 但它不起作用 我使用了以下解释http blog qt digia com blog 2011 06 03 threaded opengl in 4 8 http blog q
  • PyQt 从 GUI 获取值

    我使用构建了一个用户界面QtDesigner然后转换 ui to py 用户界面有不同comboBox and textBox单击 运行 按钮后我想从中读取值 运行函数 然后在计算完成后填充用户界面的其他文本框 但是当我改变的值comboB
  • 为什么我的 QThread 持续使 Maya 崩溃?

    我有一个 UI 我想在 Maya 内部使用线程 这样做的原因是这样我可以运行 Maya cmds 而无需挂起 冻结 UI 同时使用进度条等更新 UI 我已经阅读了 StackOverflow 中的一些示例 但我的代码每次运行时都会崩溃 我遵
  • 线程处理时出现 msgbox 错误,GUI 块 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在执行以下 gui 时遇到问题 如果没有消息框 它可以正常工作 但是当有消息框时 它会阻塞 知道为什么 gui 在有消
  • 关于 GUI 计时器显示后台线程已用时间的建议?

    Issue 我有一个 PyQt GUI 用户按下按钮即可启动后台线程 workerThread 它是从QThread 我想要一个计时器显示 以QLabel 显示自此以来已经过去了多少时间workerThread开始 我希望这个计时器在wor
  • 通过信号/槽将 QVector 从工作线程传递到主线程

    目前 我在将 QVector 传递到线程之间时遇到一些麻烦 目前我有一个主线程 GUI Thread 和一个频繁发出 QVector 数组的工作线程 在向量内直接发出数据之前看起来不错 接收者是主线程中的一个槽 但该槽接收到的数据是乱码 这
  • 如何释放Qthread对象的内存?

    我做过这样的事情 in the mainwindow s constructor QThread thr new QThread soundWorker work new soundWorker connect this SIGNAL pl
  • 在 PyQt4 中使用 PyQtGraph 实时绘图 #2

    首先对篇幅表示抱歉 我想尽可能好地解释我的问题 我对 Python 很陌生 并尝试使用 PyQt4 中嵌入的 PyQtGraph 制作一个绘图应用程序 几天前 我得到了一个非常好的答案绘图问题 https stackoverflow com

随机推荐