栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pyqt中使用信号与槽函数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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_())
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号