从零开始学Pyqt5之【如何解决自定义槽函数需要参数而信号没有参数传递的问题?(2种方式)】

简介: 从零开始学Pyqt5之【如何解决自定义槽函数需要参数而信号没有参数传递的问题?(2种方式)】

在PyQt编程过程中,经常会遇到给槽函数传递自定义参数的情况,比如有一个信号与槽函数的连接是


button.clicked.connect (show_page)


对于clicked信号来说,它是没有参数的;对于show_page函数来说,希望它可以接收参数。如下这样:


def show page (self, name):
  print (name,"点击啦")


于是就产生一个问题–信号发出的参数个数为0,槽函数接收的参数个数为1,由于0<1,这样运行起来一定会报错(原因是信号发出的参数个数一定要大于槽函数接收的参数个数)。


这种问题可以通过以下两种方式解决:


方法一:通过lambda表达式


# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout
import sys 
class WinForm(QMainWindow):  
  def __init__(self, parent=None):  
    super(WinForm, self).__init__(parent)  
    self.setWindowTitle("信号和槽传递额外参数例子")
    button1 = QPushButton('Button 1')  
    button2 = QPushButton('Button 2')  
        # 通过lambda表达式传递参数
    button1.clicked.connect(lambda: self.onButtonClick(1)) 
    button2.clicked.connect(lambda: self.onButtonClick(2))    
    layout = QHBoxLayout()
    layout.addWidget(button1)  
    layout.addWidget(button2)  
    main_frame = QWidget()
    main_frame.setLayout(layout)
    self.setCentralWidget(main_frame)
  def onButtonClick(self, n):  
    print('Button {0} 被按下了'.format(n))  
    QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))            
if __name__ == "__main__":  
  app = QApplication(sys.argv)  
  form = WinForm()  
  form.show()  
  sys.exit(app.exec_())


方法二:functools中的partial函数


将上述代码中:

button1.clicked.connect(lambda: self.onButtonClick(1)) 
button2.clicked.connect(lambda: self.onButtonClick(2))

替换为以下两行即可:


button1.clicked.connect(partial(self.onButtonClick, 1))     
button2.clicked.connect(partial(self.onButtonClick, 2)) 



相关文章
|
5月前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
50 0
|
6月前
|
设计模式
【第二章】自定义信号和槽函数
【第二章】自定义信号和槽函数
|
数据安全/隐私保护 Python
python接口自动化(三十四)-封装与调用--函数和参数化(详解)
参数化的思维只需记住一点:不要写死,这样就便于维护,否则就会牵一发而动全身,一处修改导致处处修改,不便于维护。
1199 1
python接口自动化(三十四)-封装与调用--函数和参数化(详解)
|
人工智能 编译器 C语言
如何使用函数及函数的注意事项
目录 什么是函数? 如何调用函数? 函数的先后关系? 函数的变量空间? 什么是函数? 首先我们来说一说函数的作用,就是一块简单的代码接受零个或多个参数,做一件事情,并返回零个或一个值 void sum(int a,int b) { int i; int sum=0; for(i=a:i<=b;i++) { sum+=i; } printf("%d到%d的和是%d\n",a,b,sum); } 现在我们就写出了一个简单的求和函数和数学中的y=f(x)很像 函数名 sum 返回类型 void 参数表 int a,int b 函数体 大括号里的所有东西 函数头 大括号前
|
程序员 Scala 开发者
函数(方法)的调用机制|学习笔记
快速学习函数(方法)的调用机制。
函数(方法)的调用机制|学习笔记
WebApi入门第十一章(定时器作用及语法)
WebApi入门第十一章(定时器作用及语法)
280 0
WebApi入门第十一章(定时器作用及语法)
从零开始学Pyqt5之【信号与槽函数定义与使用方法:包含自定义信号与自定义槽函数】
从零开始学Pyqt5之【信号与槽函数定义与使用方法:包含自定义信号与自定义槽函数】
|
缓存 前端开发 Swift
Swift实用小册06:函数的定义、参数、返回、调用
Swift实用小册06:函数的定义、参数、返回、调用
234 0
Swift实用小册06:函数的定义、参数、返回、调用