广告
返回顶部
首页 > 资讯 > 后端开发 > Python >PythonPyQt5学习之自定义信号
  • 398
分享到

PythonPyQt5学习之自定义信号

2024-04-02 19:04:59 398人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

PyQ5已经自动定义了很多Qt自建的信号。但是在实际的使用中为了灵活使用信号与槽机制,可以根据需要自定义信号。通过使用pyqtSignal()方法定义新的信号,新的信号作为类的属性。

PyQ5已经自动定义了很多Qt自建的信号。但是在实际的使用中为了灵活使用信号与槽机制,可以根据需要自定义信号。通过使用pyqtSignal()方法定义新的信号,新的信号作为类的属性。

自定义signal说明:

新的信号应该定义在QObject的子类中。新的信号必须作为定义类的一部分,不允许将信号作为类的属性在类定义之后通过动态的方式进行添加。通过这种方式新的信号才能自动的添加到QMetaObject类中。这就意味这新定义的信号将会出现在Qt Designer,并且可以通过QMetaObject api实现内省。

自定义信号的发射,通过emit()方法类实现

自定义信号的一般流程如下:

  1. 定义信号
  2. 定义槽函数
  3. 绑定信号和槽
  4. 发射信号

代码示例

import sys
from PyQt5.QtCore import pyqtSignal, QObject, Qt, pyqtSlot
from PyQt5.QtWidgets import QWidget, QApplication, QGroupBox, QPushButton, QLabel, QCheckBox, QSpinBox, QHBoxLayout, QComboBox, QGridLayout
 
 
class SignalEmit(QWidget):
    helpSignal = pyqtSignal(str)
    printSignal = pyqtSignal(list)
    #声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数的信号
    previewSignal = pyqtSignal([int,str],[str])
    def __init__(self):
        super().__init__()        
        self.initUI()
 
 
    def initUI(self):           
 
        self.creatContorls("打印控制:")
        self.creatResult("操作结果:")
 
        layout = QHBoxLayout()
        layout.addWidget(self.controlsGroup)
        layout.addWidget(self.resultGroup)
        self.setLayout(layout)
 
        self.helpSignal.connect(self.showHelpMessage)
        self.printSignal.connect(self.printPaper)
        self.previewSignal[str].connect(self.previewPaper)
        self.previewSignal[int,str].connect(self.previewPaperWithArgs)  
        self.printButton.clicked.connect(self.emitPrintSignal)
        self.previewButton.clicked.connect(self.emitPreviewSignal)
 
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('defined signal')
        self.show()
 
    def creatContorls(self,title):
        self.controlsGroup = QGroupBox(title)
        self.printButton = QPushButton("打印")
        self.previewButton  = QPushButton("预览")
        numberLabel = QLabel("打印份数:")
        pageLabel = QLabel("纸张类型:")
        self.previewStatus = QCheckBox("全屏预览")
        self.numberSpinBox = QSpinBox()
        self.numberSpinBox.setRange(1, 100)
        self.styleCombo = QComboBox(self)
        self.styleCombo.addItem("A4")
        self.styleCombo.addItem("A5")
 
        controlsLayout = QGridLayout()
        controlsLayout.addWidget(numberLabel, 0, 0)
        controlsLayout.addWidget(self.numberSpinBox, 0, 1)
        controlsLayout.addWidget(pageLabel, 0, 2)
        controlsLayout.addWidget(self.styleCombo, 0, 3)
        controlsLayout.addWidget(self.printButton, 0, 4)
        controlsLayout.addWidget(self.previewStatus, 3, 0)
        controlsLayout.addWidget(self.previewButton, 3, 1)
        self.controlsGroup.setLayout(controlsLayout)
 
    def creatResult(self,title):
        self.resultGroup = QGroupBox(title)
        self.resultLabel = QLabel("")
        layout = QHBoxLayout()
        layout.addWidget(self.resultLabel)
        self.resultGroup.setLayout(layout)
 
    def emitPreviewSignal(self):
        if self.previewStatus.isChecked() == True:
            self.previewSignal[int,str].emit(1080," Full Screen")
        elif self.previewStatus.isChecked() == False:
            self.previewSignal[str].emit("Preview")
 
    def emitPrintSignal(self):
        pList = []
        pList.append(self.numberSpinBox.value ())
        pList.append(self.styleCombo.currentText())
        self.printSignal.emit(pList)
 
    def printPaper(self,list):
        self.resultLabel.setText("Print: "+"份数:"+ str(list[0]) +"  纸张:"+str(list[1]))
 
    def previewPaperWithArgs(self,style,text):
        self.resultLabel.setText(str(style)+text)
 
    def previewPaper(self,text):
        self.resultLabel.setText(text)          
 
    def keyPressEvent(self, event):
 
        if event.key() == Qt.Key_F1:
            self.helpSignal.emit("help message")
 
    def showHelpMessage(self,message):
        self.resultLabel.setText(message)
        #self.statusBar().showMessage(message)
 
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
    dispatch = SignalEmit()
    sys.exit(app.exec_())

样例说明:

通过一个模拟打印的界面来详细说明一下关于信号的自定义,在打印的时候可以设定打印的分数,纸张类型,触发“打印”按钮之后,将执行结果显示到右侧;通过全屏预览QCheckBox来选择是否通过全屏模式进行预览,将执行结果显示到右侧。

通过点击F1快捷键,可以显示helpMessage信息。

界面分析:

该界面主要由两个部分组成:一个是打印控制,另一个是操作结果。

通过QHBoxLayout组合起来,如下所示:

layout = QHBoxLayout()
layout.addWidget(self.controlsGroup)
layout.addWidget(self.resultGroup)
self.setLayout(layout)

然后通过creatContorls定义“打印控制”界面,

def creatContorls(self,title):
    self.controlsGroup = QGroupBox(title)
    self.printButton = QPushButton("打印")
    self.previewButton  = QPushButton("预览")
    numberLabel = QLabel("打印份数:")
    pageLabel = QLabel("纸张类型:")
    self.previewStatus = QCheckBox("全屏预览")
    self.numberSpinBox = QSpinBox()
    self.numberSpinBox.setRange(1, 100)
    self.styleCombo = QComboBox(self)
    self.styleCombo.addItem("A4")
    self.styleCombo.addItem("A5")
 
    controlsLayout = QGridLayout()
    controlsLayout.addWidget(numberLabel, 0, 0)
    controlsLayout.addWidget(self.numberSpinBox, 0, 1)
    controlsLayout.addWidget(pageLabel, 0, 2)
    controlsLayout.addWidget(self.styleCombo, 0, 3)
    controlsLayout.addWidget(self.printButton, 0, 4)
    controlsLayout.addWidget(self.previewStatus, 3, 0)
    controlsLayout.addWidget(self.previewButton, 3, 1)
    self.controlsGroup.setLayout(controlsLayout)

QSpinBox是一个计数器控件,允许用户选择一个整数值通过单击向上向下或者按键盘上的上下键来增加减少当前显示的值,当然用户也可以输入值。

QComboBox是一个集按钮和下拉选项于一体的控件,也称做下拉列表框。

 然后通过creatResult定义“操作结果”界面:

def creatResult(self,title):
        self.resultGroup = QGroupBox(title)
        self.resultLabel = QLabel("")
        layout = QHBoxLayout()
        layout.addWidget(self.resultLabel)
        self.resultGroup.setLayout(layout)

代码分析:

helpSignal = pyqtSignal(str)
printSignal = pyqtSignal(list)
#声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数的信号
previewSignal = pyqtSignal([int,str],[str])

通过pyqtSignal()定义了三个信号,helpSignal,printSignal,previewSignal。其中:

  • helpSignal 为str参数类型的信号。
  • printSignal 为list参数类型的信号。
  • previewSignal为一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及str类行的参数。
self.helpSignal.connect(self.showHelpMessage)
self.printSignal.connect(self.printPaper)
self.previewSignal[str].connect(self.previewPaper)
self.previewSignal[int,str].connect(self.previewPaperWithArgs)  
self.printButton.clicked.connect(self.emitPrintSignal)
self.previewButton.clicked.connect(self.emitPreviewSignal)

绑定信号和槽。

着重说明一下多重载版本的信号的绑定,previewSignal有两个版本previewSignal(str),previewSignal(int,str)。由于存在两个版本,从因此在绑定的时候需要显式的指定信号和槽的绑定关系。

具体如下:

self.previewSignal[str].connect(self.previewPaper) self.previewSignal[int,str].connect(self.previewPaperWithArgs)

其中[str]参数的previewSignal信号绑定previewPaper();[int,str]的previewSignal信号绑定previewPaperWithArgs()

def emitPreviewSignal(self):
        if self.previewStatus.isChecked() == True:
            self.previewSignal[int,str].emit(1080," Full Screen")
        elif self.previewStatus.isChecked() == False:
            self.previewSignal[str].emit("Preview")

多重载版本的信号的发射也需要制定对应发射的版本,类似同信号的版定。

def emitPrintSignal(self):
        pList = []
        pList.append(self.numberSpinBox.value ())
        pList.append(self.styleCombo.currentText())
        self.printSignal.emit(pList)

如代码中所示,在信号发射的时候可以传递python数据类型的参数,在本例中传递list类型的参数pList。

def keyPressEvent(self, event):
    if event.key() == Qt.Key_F1:
         self.helpSignal.emit("help message")

通过复写keyPressEvent()方法,将F1快捷键进行功能的拓展。在windows的大部分应用,我们都会使用一些快捷键来快速的完成某些特定的功能。比如F1键,会快速调出帮助界面,那就可以复写keyPressEvent()方法来模拟发送所需的信号,来完成对应任务。

注意事项:

1.自定义的信号在init()函数之前定义

2.自定义型号可以传递,str、int、list、object、float、tuple、dict等很多类型的参数

3.注意signal和slot的调用逻辑,避免signal和slot之间出现死循环。如在slot方法中继续发射该信号

到此这篇关于Python PyQt5学习之自定义信号的文章就介绍到这了,更多相关Python PyQt5信号内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PythonPyQt5学习之自定义信号

本文链接: https://www.lsjlt.com/news/141009.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PythonPyQt5学习之自定义信号
    PyQ5已经自动定义了很多QT自建的信号。但是在实际的使用中为了灵活使用信号与槽机制,可以根据需要自定义信号。通过使用pyqtSignal()方法定义新的信号,新的信号作为类的属性。...
    99+
    2022-11-13
  • python3学习之自定义函数
    静态参数:def  函数名(参数1,参数2=默认值):"""注释文档"""    print("测试")    return "abc"说明:参数可以有多个,并可以指定默认值;一定要写注释文档动态参数:def  函数名(*args):   ...
    99+
    2023-01-31
    自定义 函数
  • Python学习之自定义异常详解
    目录自定义抛出异常关键字 - raise演示小案例 - 1演示小案例 - 2自定义异常类总结在上一章我们学习了 异常的三个关键字,分别是try、except 以及 finally。我...
    99+
    2022-11-13
  • Angular学习之聊聊notification(自定义服务)
    比如,我们这篇文章要讲到的 notification 的实现。【相关教程推荐:《angular教程》】效果图如下:UI 这个可以后期调整So,我们一步步来分解。添加服务我们在 app/services 中添加 notification.se...
    99+
    2023-05-14
    前端 JavaScript Angular.js
  • Flutter学习之实现自定义themes详解
    目录简介MaterialApp中的themes自定义themes的使用总结简介 一般情况下我们在flutter中搭建的app基本上都是用的是MaterialApp这种设计模式,Mat...
    99+
    2023-03-06
    Flutter自定义themes Flutter themes
  • Java异常学习之自定义异常详解
    前言哎呀,妈呀,又出异常了!俗话说:“代码虐我千百遍,我待代码如初恋”。小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常。Java异常的体系什么的,理论知识啥的我就懒得去BB太多了,是个搞J...
    99+
    2023-05-31
    java 自定义异常 ava
  • python 自定义异常类学习
    #自定义异常类 class MyException(Exception): pass def exextp_01(): try: #come code here list = ['java...
    99+
    2023-01-31
    自定义 异常 python
  • C#微信公众号开发之自定义菜单
    前言: 回顾之前的微信公众号配置和消息处理的内容,我们已经掌握了如何配置服务器与微信公众号建立连接,也掌握了通过消息管理的方式,对用户的信息进行处理,完成公众号消息回复功能,实现公众...
    99+
    2022-11-13
  • taro之--微信自定义tabbar
    微信小程序自定义 Tabbar Taro 支持使用 React、Vue、或者小程序原生语法来编写小程序自定义 TabBar 组件。 示例项目 微信小程序自定义 TabBar(React) 微信小程序自定义 TabBar(Vue3) ...
    99+
    2023-09-02
    小程序 taro Powered by 金山文档
  • 学习Android自定义Spinner适配器
    本文为大家分享Android自定义Spinner适配器的相关知识点,供大家参考,具体内容如下 一、大致效果 二.关键代码 在注释中讲重点吧。 (1)Spinner的布局: ...
    99+
    2022-06-06
    spinner Android
  • Python PyQt5中如何自定义信号
    这篇文章将为大家详细讲解有关Python PyQt5中如何自定义信号,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PyQ5已经自动定义了很多QT自建的信号。但是在实际的使用中为了灵活使用信号与槽...
    99+
    2023-06-29
  • Android自定义控件之开关按钮学习笔记分享
    今天来讲讲自定义单个控件,就拿开关按钮来讲讲,相信大家见了非常多这样的了,先看看效果: 我们可以看到一个很常见的开关按钮,那就来分析分析。 首先: 这是由两张图片构成: ①一...
    99+
    2022-06-06
    学习笔记 开关 学习 按钮 Android
  • Android自定义控件之组合控件学习笔记分享
    我们来讲一下自定义组合控件,相信大家也接触过自定义组合控件吧,话不多说,直接干(哈~哈~): 大家看到这个觉得这不是很简单的吗,这不就是写个布局文件就搞定嘛,没错,确实直接上...
    99+
    2022-06-06
    学习笔记 学习 Android
  • MySQL池化框架学习接池自定义
    目录引言可池化对象池化工厂对象池API封装引言 最近在学习了通用池化框架commons-pool2实践之后,再HTTP性能测试中进行了实践,结果出乎意料,对于性能提升没啥卵用。经过我自己的本地测试,性能也是足够好的。 后...
    99+
    2022-07-21
    MySQL连接池自定义 MySQL池化框架
  • kubernetes k8s CRD自定义资源学习笔记
    目录CustomResourceDefinition简介:目前扩展Kubernetes API的常用方式有3种:配置规范示例1: 创建自定义CRD创造自定义CRD类型示例2: etc...
    99+
    2022-11-13
  • 一小时学会TensorFlow2之自定义层
    目录概述SequentialModel & Layer案例数据集介绍完整代码概述 通过自定义网络, 我们可以自己创建网络并和现有的网络串联起来, 从而实现各种各样的网络结构....
    99+
    2022-11-12
  • Qt信号自定义槽函数的实现
    目录使用无参数信号与槽使用有参信号传递点击按钮触发信号匿名函数与槽Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师学生为例子简单学习一...
    99+
    2022-11-12
  • linux自定义信号的方法是什么
    在Linux中,可以使用以下方法来自定义信号:1. 使用`signal()`函数:可以使用`signal()`函数来设置信号处理程序...
    99+
    2023-08-12
    linux
  • Vue自定义指令学习及应用详解
    目录一、自定义指令v-mycolor二、使用钩子函数的自定义指令三、Vue实现简单的学生信息管理系统除了核心功能默认内置的指令,Vue.js允许注册自定义指令。添加一个自定义指令,有...
    99+
    2023-05-19
    Vue自定义指令学习 Vue自定义指令应用 Vue自定义指令 Vue 指令
  • Python学习之函数的定义与使用详解
    目录函数的定义函数的分类函数的创建方法-def函数的返回值-returnreturn与print的区别函数的传参必传参数默认参数不确定参数(可变参数)参数规则函数小练习函数的参数类型...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作