pyqt中使用信号与槽函数

关于pyqt5中界面的信号signal与槽函数记录,主要就是记录通过信号与槽函数的方式主线程向界面实时传递数据进行展示的方法


一、演示界面

这个演示界面其实就是一个演示作用,接收不同线程发送来的数据,来更新界面,这里用的是pyqtgraph进行曲线演示。
首先,用pyqt5创建一个layout,名为Continues_SignalLayout,用于后续通过pyqtgraph来设置曲线,代码如下:

import sys
import numpy as np
import matplotlib.pyplot as plt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow
import pyqtgraph as pg


class Ui_Continues_Signal(object):
    def setupUi(self, Continues_Signal):
        Continues_Signal.setObjectName("Continues_Signal")
        Continues_Signal.resize(690, 420)
        Continues_Signal.setFixedSize(690, 420)

        # layout
        self.centralwidget = QtWidgets.QWidget(Continues_Signal)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(5, 10, 680, 400))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.Continues_SignalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.Continues_SignalLayout.setContentsMargins(0, 0, 0, 0)
        self.Continues_SignalLayout.setObjectName("Continues_Signal_Layout")
        Continues_Signal.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, Continues_Signal):
        _translate = QtCore.QCoreApplication.translate
        Continues_Signal.setWindowTitle(_translate("Continues_Signal", "Continues_Signal"))

然后,通过pyqtgraph设置所绘曲线的一些信息,这里简单画一个正弦曲线的显示界面DisplayWin,代码如下:

class DisplayWin(QtWidgets.QMainWindow, Ui_Continues_Signal):
    def __init__(self):
        super(DisplayWin, self).__init__()

        self.setupUi(self)

        # 初始化显示曲线
        self.Signal_Win = self.SetSignalPlot()
        self.SignalCurve = self.Signal_Win.plot(pen=pg.mkPen('w', width=2))
        
        # 示例显示
        self.SignalCurve.setData(x=np.linspace(0, 2*np.pi, 100), y=np.sin(np.linspace(0, 2*np.pi, 100)))

    def SetSignalPlot(self):
    	# 添加曲线
        pg.setConfigOptions(antialias=True)

        Win_signal = pg.GraphicsLayoutWidget()
        # pg.setConfigOption('background', '#FFFFFF')
        # pg.setConfigOption('foreground', 'k')
        self.Continues_SignalLayout.addWidget(Win_signal)

        p1 = Win_signal.addPlot(title="Continues Signal")
        p1.setLabel('left', text='mag', color='#ffffff')      # y轴设置函数
        # p1.showGrid(x=True, y=True, alpha=0.2)              # 栅格设置函数
        p1.setLogMode(x=False, y=False)                       # False代表线性坐标轴,True代表对数坐标轴
        p1.setLabel('bottom', text='sample')                  # x轴设置函数

        return p1

添加如下主函数即可进行显示

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

整体界面显示如下:在这里插入图片描述

二、信号与槽函数

既然要实现主线程与界面之间的信号通信,第一步就需要去定义信号与槽函数,首先在上面的DisplayWin类中定义槽函数updateSignal,如下:

    def updateSignal(self, data_x, data_y):
        self.SignalCurve.setData(x=data_x, y=data_y)

这里的SignalCurve就是上面定义的演示正弦曲线,data就是后面需要实时更新的数据。槽函数定义好了,那么下一步就是定义信号了。这里定义一个信号更新线程SignalUpdateThread,如下:

class SignalUpdateThread(QtCore.QThread):
    newSignal = QtCore.Signal(np.ndarray, np.ndarray)

    def __init__(self):
        super(SignalUpdateThread, self).__init__()

    def run(self):
        self.mainThread()

    def mainThread(self):
    	# 实时往复更新曲线
        x, y = np.linspace(0, 2*np.pi, 100), np.sin(np.linspace(0,2*np.pi, 100))
        while True:
            temp = y[1]
            y[0:-1] = y[1:]
            y[-1] = temp

            # 延时0.5s,不然更新太快了
            time.sleep(0.01)

            # 发射最新的数据y
            self.newSignal.emit(x, y)

这里定义了信号newSignal,并在mainThread中往复更新正弦曲线随后发送。
现在信号有了,槽函数也有了,下一步就是将槽函数和信号连接起来,在主函数中实现,代码如下:

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myWin = DisplayWin()
    myWin.show()

    SUT_thread = SignalUpdateThread()
    # 连接信号与槽函数
    SUT_thread.newSignal.connect(myWin.updateSignal)
    SUT_thread.start()

    sys.exit(app.exec_())

演示效果如下:
在这里插入图片描述

三、完整代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :11 
@File :gra.py
@IDE  :PyCharm 
@Author :Jackie
@Date :2022/5/15 16:21 
@File Brief: Signal and slot function record.
"""
import sys
import numpy as np
import matplotlib.pyplot as plt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow
import pyqtgraph as pg
import time


class Ui_Continues_Signal(object):
    def setupUi(self, Continues_Signal):
        Continues_Signal.setObjectName("Continues_Signal")
        Continues_Signal.resize(690, 420)
        Continues_Signal.setFixedSize(690, 420)

        # layout
        self.centralwidget = QtWidgets.QWidget(Continues_Signal)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(5, 10, 680, 400))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.Continues_SignalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.Continues_SignalLayout.setContentsMargins(0, 0, 0, 0)
        self.Continues_SignalLayout.setObjectName("Continues_Signal_Layout")
        Continues_Signal.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, Continues_Signal):
        _translate = QtCore.QCoreApplication.translate
        Continues_Signal.setWindowTitle(_translate("Continues_Signal", "Continues_Signal"))


class DisplayWin(QtWidgets.QMainWindow, Ui_Continues_Signal):
    def __init__(self):
        super(DisplayWin, self).__init__()

        self.setupUi(self)

        # 初始化显示曲线
        self.Signal_Win = self.SetSignalPlot()
        self.SignalCurve = self.Signal_Win.plot(pen=pg.mkPen('w', width=2))
        self.SignalCurve.setData(x=np.linspace(0, 2*np.pi, 100), y=np.sin(np.linspace(0, 2*np.pi, 100)))

    def SetSignalPlot(self):
        pg.setConfigOptions(antialias=True)

        Win_signal = pg.GraphicsLayoutWidget()
        # pg.setConfigOption('background', '#FFFFFF')
        # pg.setConfigOption('foreground', 'k')
        self.Continues_SignalLayout.addWidget(Win_signal)

        p1 = Win_signal.addPlot(title="Continues Signal")
        p1.setLabel('left', text='mag', color='#ffffff')      # y轴设置函数
        # p1.showGrid(x=True, y=True, alpha=0.2)              # 栅格设置函数
        p1.setLogMode(x=False, y=False)                       # False代表线性坐标轴,True代表对数坐标轴
        p1.setLabel('bottom', text='sample')                  # x轴设置函数

        return p1

    def updateSignal(self, data_x, data_y):
        self.SignalCurve.setData(x=data_x, y=data_y)


class SignalUpdateThread(QtCore.QThread):
    newSignal = QtCore.Signal(np.ndarray, np.ndarray)

    def __init__(self):
        super(SignalUpdateThread, self).__init__()

    def run(self):
        self.mainThread()

    def mainThread(self):
        x, y = np.linspace(0, 2*np.pi, 100), np.sin(np.linspace(0,2*np.pi, 100))
        while True:
            temp = y[1]
            y[0:-1] = y[1:]
            y[-1] = temp

            # 延时0.5s,不然更新太快了
            time.sleep(0.01)

            # 发射最新的数据y
            self.newSignal.emit(x, y)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myWin = DisplayWin()
    myWin.show()

    SUT_thread = SignalUpdateThread()
    # 连接信号与槽函数
    SUT_thread.newSignal.connect(myWin.updateSignal)
    SUT_thread.start()

    sys.exit(app.exec_())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值