从零开始学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
Python函数参数的魔法:揭秘如何用它们施展代码的无限可能!
【8月更文挑战第22天】Python函数参数展现了语言的强大与灵活。本文涵盖位置参数、默认参数、可变参数(*args)、关键字参数(**kwargs)及参数解包等,通过实例展示如何利用这些特性增强函数复用性与扩展性。类型注解的加入进一步提升了代码的可读性和健壮性。掌握这些技巧能帮助开发者写出更高效优雅的Python代码。
63 0
|
3月前
|
前端开发 Java API
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
本文是Vert.x学习系列的第五部分,讨论了回调函数的限制、Future和Promise在异步操作中的应用、响应式扩展以及Kotlin协程,并通过示例代码展示了如何在Vert.x中使用这些异步编程模式。
65 5
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
|
8月前
|
机器学习/深度学习 数据采集 自然语言处理
python函数参数的传递、带星号参数的传递,2024年大厂Python高级面试题分享
python函数参数的传递、带星号参数的传递,2024年大厂Python高级面试题分享
|
8月前
|
设计模式
【第二章】自定义信号和槽函数
【第二章】自定义信号和槽函数
|
8月前
|
开发者 Python
Python中的仅限位置参数:简化函数调用与提升代码清晰度
【4月更文挑战第17天】Python 3.8 引入了仅限位置参数,增强函数调用清晰度和安全性。通过`/`语法,开发者可指定某些参数只能按位置传递,防止顺序错误和不必要的关键字参数。这有助于提高代码可读性,确保参数正确传递,并在复杂函数中提升安全性。在实际应用中,仅限位置参数可用于明确参数位置、保持向后兼容性和增强函数安全性。
《QT从基础到进阶·二》信号发送后槽函数执行多次
《QT从基础到进阶·二》信号发送后槽函数执行多次
105 0
|
Python
学习Python语言的语法,例如函数、类、模块、循环中的类详解
学习Python语言的语法,例如函数、类、模块、循环中的类详解
71 1
|
程序员
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-2
5.5:练习(部分上一期做过,换成函数做法): (1).写一个函数可以判断一个数是不是素数:
|
程序员 编译器 C语言
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-1
1.函数是什么: 维基百科中对函数的定义:子程序 * 在计算机科学中,子程序(英语: