我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python PyQt5中如何自定义信号

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python PyQt5中如何自定义信号

这篇文章将为大家详细讲解有关Python PyQt5中如何自定义信号,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

自定义signal说明:

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

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

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

  1. 定义信号

  2. 定义槽函数

  3. 绑定信号和槽

  4. 发射信号

代码示例

import sysfrom PyQt5.QtCore import pyqtSignal, QObject, Qt, pyqtSlotfrom 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()方法来模拟发送所需的信号,来完成对应任务。

Python PyQt5中如何自定义信号

注意事项:

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

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

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

关于“Python PyQt5中如何自定义信号”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python PyQt5中如何自定义信号

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

下载Word文档

猜你喜欢

Python PyQt5中如何自定义信号

这篇文章将为大家详细讲解有关Python PyQt5中如何自定义信号,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PyQ5已经自动定义了很多QT自建的信号。但是在实际的使用中为了灵活使用信号与槽机制,可以
2023-06-29

python PyQt5(自定义)信号与槽使用及说明

这篇文章主要介绍了python PyQt5(自定义)信号与槽使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-16

使用PyQt5 如何在QListWidget中自定义Item

使用PyQt5 如何在QListWidget中自定义Item?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。自定义一个Item新建一个QWidget对象在QWid
2023-06-08

Python中如何自定义函数

这篇文章主要介绍了Python中如何自定义函数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-04

如何进行Qt 信号自定义槽函数的实现

本篇文章为大家展示了如何进行Qt 信号自定义槽函数的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师
2023-06-21

Python如何自定义函数

小编给大家分享一下Python如何自定义函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!自定义函数import requestsfrom bs4 import
2023-06-27

Python如何自定义元类

这篇文章主要介绍了Python如何自定义元类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用
2023-06-14

Python中如何自定义密码验证

这篇文章主要介绍“Python中如何自定义密码验证”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中如何自定义密码验证”文章能帮助大家解决问题。下面是重构后的代码:from string
2023-06-29

python中如何调用自定义函数

要调用自定义函数,首先需要定义该函数,然后在需要调用该函数的地方使用函数名加上括号来调用它。例如:def my_function():print("Hello, world!")my_function() # 调用自定义函数在上面的例子
python中如何调用自定义函数
2024-03-14

微信小程序中如何自定义组件

这篇文章将为大家详细讲解有关微信小程序中如何自定义组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在微信小程序开发过程中,对于一些可能在多个页面都使用的页面模块,可以把它封装成一个组件,以提高开发效率。
2023-06-29

python中如何使用自定义异常类

本篇文章为大家展示了python中如何使用自定义异常类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。自定义异常类1.自定义类2.继承系统的异常基类exception3.自定义异常类的构造函数等方法进
2023-06-20

Keras中如何定义一个自定义的层

要定义一个自定义的层,需要继承keras.layers.Layer类,并重写__init__和call方法。下面是一个简单的示例:import tensorflow as tffrom tensorflow import kerasf
Keras中如何定义一个自定义的层
2024-03-14

如何在微信公众号上使用PHP开发自定义菜单

如何在微信公众号上使用PHP开发自定义菜单微信公众号是一个非常重要的媒介,很多企业和个人都选择在微信公众号上进行推广和交流。而自定义菜单则是微信公众号中不可或缺的一部分,可以帮助提高用户体验和导航功能。本文将介绍如何使用PHP开发自定义菜单
2023-10-27

python自定义的包如何导入

要导入自定义的包,可以按照以下步骤进行操作:1. 确保自定义的包所在的目录在Python的搜索路径中。可以通过在代码中添加目录到sys.path列表,或者将自定义的包目录添加到PYTHONPATH环境变量中来实现。可以在代码中使用以下代码来
2023-09-08

python如何调用自定义函数

要调用自定义函数,需要按照以下步骤进行:1. 定义一个函数。例如,我们定义一个名为`add_numbers`的函数,用于求两个数的和。```pythondef add_numbers(a, b):return a + b```2. 调用函数
2023-09-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录