PySide6 GUI编程(三十八):信号拦截与lambda槽函数

发布于:2024-10-24 编辑:匿名 来源:网络

自定义信号自定义信号的场景在之前的文章:PySide6 GUI编程(三):信号与槽机制中已经讨论过。在一些需要更大灵活性的场景中,我们需要定制信号来触发更多定制的行为。

示例代码 代码语言:python 代码运行次数:0 Copy Cloud Studio 代码 run from __future__ import comments from PySide6.QtCore import QObject, Signaldef show_signal_parameters(*args): if len(args) == 0: print('发送的参数信号为空') return if len(args) != 1: print('信号发送的参数个数错误') return print('信号发送的参数:', args[0])class MySignals(QObject): """ Signal 只能在继承自 QObject 的类中使用。这是因为 Signal 和 Slot 机制是 Qt 的核心功能,而该功能是通过 QObject 类实现的。

""" my_signal_1 = Signal (str) my_signal_2 = 信号(int) my_signal_3 = 信号(浮点) my_signal_4 = 信号(bool) my_signal_5 = 信号(列表) my_signal_6 = 信号(dict) my_signal_7 = 信号(元组) my_signal_8 = 信号(设置) my_signal_9 = 信号(对象) ) def __init__(self): super(). __init__() self.my_signal_1.connect(show_signal_parameters) self.my_signal_2.connect(show_signal_parameters) self.my_signal_3.connect(show_signal_parameters) self.my_signal_4.connect(show_signal_parameters) self.my_signal_5.connect(show_signal_parameters) self.my_signal_6.connect(show_signal_parameters) self.my_signal_7.connect(show_signal_parameters) self.my_signal_8.connect(show_signal_parameters) self.my_signal_9.connect(show_signal) _参数) self.my_signal_1.emit('1') self.my_signal_2.emit(2) self.my_signal_3.emit(3.) self.my_signal_4.emit(4) self.my_signal_5.emit([5, ]) self.my_signal_6 。发出({'6': 6}) self.my_signal_7.emit((7,)) self.my_signal_8.emit({8, }) self.my_signal_9.emit([9, '9', ])if __name__ = = '__main__': MySignals() 操作效果 自定义信号和信号参数 使用匿名函数拦截信号 在标准 PySide6 信号中,信号和槽函数的输入参数始终是固定的,虽然这可以在普通信号中使用带来方便,但它也限制了一些更灵活的用途,例如按钮点击行为。

当我想要获取更多信息时,标准的信号和槽函数无法满足要求,所以需要拦截原生信号。 ,并对信号参数进行重新处理或打包,传递给自定义函数进行处理。

示例代码 代码语言:python 代码运行时间:3 Copy Cloud Studio 代码 run from __future__ import comments from datetime import datetime from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidgetdef on_button_clicked(clicked: bool): """ 标准槽函数 ,仅接收 clicked: bool 参数 """ print('Button was clicked (standard slot function on_button_clicked):', clicked, datetime.now().isoformat())def on_button_clicked_2(clicked: bool, button: QPushButton): " ""自定义中间槽函数接收clicked:bool和button:QPushButton参数,clicked:bool是按钮点击时发送的参数,是标准槽函数参数,中间槽函数会额外接收button:QPushButton参数。 """ print( '按钮被单击(中间槽函数 on_button_clicked_2):', clicked, button.text(), datetime.now().isoformat())# def on_button_clicked_4(clicked: bool, button: QPushButton ):# print('按钮被 Click (中间槽函数 on_button_clicked_4, 与 functools.partial 结合使用):', clicked, button.text(),# datetime.now().isoformat())class MyWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('信号拦截及信号参数修改') button1 = QPushButton('测试按钮1(标准槽函数)') button1.setCheckable(True ) # 设置为checkable,这样槽函数中接收的参数为True Button1.clicked.connect(on_button_clicked) button2 = QPushButton('测试按钮2(lambda表达式作为中间槽函数)') button2.setCheckable(True) #使用lambda表达式作为中间槽函数button2.clicked.connect(lambda button_clicked: on_button_clicked_2(clicked = button_clicked, button = button2)) button3 = QPushButton('测试按钮3(纯lambda表达式槽函数)') button3.setCheckable( True) # 使用lambda表达式作为中间槽函数 # button=button3 是一个默认参数 # 它的值在定义lambda函数时就确定了 # 因此,即使在调用槽函数时button变量的值发生了变化,它也会被传递给槽函数button参数的值仍然是定义lambda函数时的值button3.clicked.connect( lambda clicked, button = button3: print('Button was clicked (纯lambda表达式槽函数):',clicked,button.text(),datetime.now().isoformat())) #button4 = QPushButton('测试按钮4(functools.partial方法会报错)') #button4.setCheckable(True) # # functools .partial 可以生成一个与原函数行为相同的新函数,但有些参数有预设值 # # 当前场景中,当信号连接到槽函数时,我们使用 functools.partial 来创建一个新函数, # # 它将button作为预设参数传递给on_button_clicked # # 但在当前场景下,使用functools.partial的方法不适用,因为预设参数会放在其他参数之前,导致有一个参数传递问题 # # 运行时会报错: TypeError: on_button_clicked_4() miss 1 requiredpositional argument: 'clicked' # new_func = functools.partial(on_button_clicked_4, button = button4) # button4.clicked.connect(new_func) v_main_layout = QVBoxLayout () v_main_layout.addWidget(button1) v_main_layout.addWidget(button2) v_main_layout.addWidget(button3) # v_main_layout.addWidget(button4) 容器 =QWidget() container.setLayout(v_main_layout) self.setCentralWidget(container)if ??__name__ == '__main__': app = QApplication() ins = MyWindow() ins.show() app.exec() 匿名函数参数示例运行基于Lambda槽函数进行信号拦截的效果。

使用匿名函数时的陷阱。匿名函数中的变量引用问题是一个非常常见的陷阱。

尤其是在循环中使用匿名函数时,很容易形成一些错觉。示例代码 代码语言:python 代码运行时间:0 Copy Cloud Studio 代码运行 from __future__ import comments from PySide6.QtGui import QFontfrom PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidgetclass MyMainWindow(QMainWindow): def __init__(self ) : super().__init__() self.setWindowTitle('在 lambda 槽函数中使用参数值传递的示例') v_main_layout = QVBoxLayout() for i in range(10): button = QPushButton(str(i),parent = self ) # 由于 lambda 函数没有自己的 i 变量 # 它将捕获外部作用域中对 i 的引用 # 这意味着当单击按钮时 # self.button_clicked_1 方法将在最后收到 i 的值循环的 # 改为创建按钮时的值 button.clicked.connect(lambda clicked: self.button_clicked_1(i)) # 默认参数值 = i 用于捕获当前 i 值 # 由于对默认参数进行求值当定义 lambda 函数时 # 它将在每次循环迭代中捕获 i 的当前值 # 这样,当单击按钮时, self.button_clicked_2 方法将收到正确的值 # 即与按钮 button.clicked 关联的值.connect(lambda 点击, value = i: self.button_clicked_2(value)) # 使用闭包保证每个按钮的点击事件都能正确传递其对应的i值 button.clicked.connect(self.create_click_handler(i)) v_main_layout.addWidget(button ) self.label_1 = QLabel('label_1') self.label_1.setFont(QFont('UbuntuMono NF', 20)) self.label_2 = QLabel('label_2') self.label_2.setFont(QFont('UbuntuMono NF', 20)) self .label_3 = QLabel('label_3') self.label_3.setFont(QFont('UbuntuMono NF', 20)) v_main_layout.addWidget(QLabel('-' * 16)) v_main_layout.addWidget(self.label_1) v_main_layout.addWidget( QLabel('-' * 16)) v_main_layout.addWidget(self.label_2) v_main_layout.addWidget(QLabel('-' * 16)) v_main_layout.addWidget(self.label_3) 容器 = QWidget() 容器.setLayout (v_main_layout) self .setCentralWidget(容器)def button_clicked_1(self, value: int): self.label_1.setText('button_clicked_1, value={}'.format(str(value))) def button_clicked_2(self, value: int): self.label_2.setText(' button_clicked_2, value={}'.format(str(value))) # 闭包 def create_click_handler(self, value: int): def on_click(_: bool): self.label_3.setText('button_clicked_3, value={} ' .format(str(value))) return on_clickif __name__ == '__main__': app = QApplication() ins = MyMainWindow() ins.show() app.exec() 的核心逻辑也可以通过闭包来避免引用。

问题在于运行效果错误的lambda参数引用是通过匿名函数设置槽函数的默认参数。在匿名函数的基础上,我们可以对槽函数进行更多的修改。

设置默认功能是修改项目之一。

PySide6 GUI编程(三十八):信号拦截与lambda槽函数

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • “曲工厂”获梅鹤资本领投数百万元天使轮融资

    “曲工厂”获梅鹤资本领投数百万元天使轮融资

    据投资界2月18日消息,M2B(Maker to Business,即制造商-经销商)整合营销交易服务平台“曲工厂”完成由梅鹤资本领投的数百万元天使轮融资。 据悉,本轮融资后,曲厂将继续发展与渠道代理商的合作。 目前,曲厂已完成珠三角十多个城市的渠道布局,建立了分销网点和服务体系

    06-17

  • 跨境电商较量:SHEIN、特木、速卖通各显所长

    跨境电商较量:SHEIN、特木、速卖通各显所长

    回顾全年,各行业都发生了不小的变化。 其中,最引人瞩目的无疑是电商行业。 经过多年的发展,电子商务不再仅仅代表一种购物方式,而是已经渗透到人们的日常生活中,改变了消费者的购物习惯,成为人们生活的重要组成部分。 自出现以来,电商行业的竞争从未真正停止过,各路玩

    06-17

  • 2022Q2十大晶圆代工厂营收排名

    2022Q2十大晶圆代工厂营收排名

    根据TrendForce研究,受消费终端需求持续疲软影响,下游渠道业者及品牌商库存压力大幅增加,但特定物料仍有零星。 零部件缺货,但总体来说两年的缺货已经正式结束,品牌厂商也因应市场情况的变化而逐渐暂停备货。 但汽车、工业控制相关需求保持稳定,是支撑晶圆代工产值持续增

    06-06

  • 苹果妥协,三星跟进,法国这条新法希望你的手机能用得更长久

    苹果妥协,三星跟进,法国这条新法希望你的手机能用得更长久

    不同国家和地区大公司不同的销售策略一直是人们讨论的热点话题之一。 此前iPhone 12发售时,因包装盒内没有充电器和耳机而遭到大量用户投诉。 当时,也有人发现苹果在法国销售的 iPhone 12 配备了 EarPods 耳机,并大喊自己被骗了,但事实上,这只是法国的法律要求。 无独有偶

    06-21

  • 滴滴上线“全聚”系统,提供一站式“网约车金融”服务

    滴滴上线“全聚”系统,提供一站式“网约车金融”服务

    近日,滴滴金融服务推出一站式“网约车金融”服务平台“全聚”系统。 该系统利用滴滴金融独特的账户管理和大数据风控能力,更高效地为出行生态内的合作伙伴提供量身定制的金融服务。 “全聚”联合汽车融资租赁公司丰邦、多家出资方、保险公司等合作伙伴,服务于出行行业中间

    06-18

  • 中国互联网30年-互联网企业代表发言:王志天元

    中国互联网30年-互联网企业代表发言:王志天元

    1.守正等待合适的时机,专攻新事物:莫倩强调在专业领域深耕并等待机会的重要性。 通过坚持和积累,企业才能在技术趋势到来时迅速发展。 2、大模型时代的机遇:谷歌发布Transformer模型后,公司凭借自主创新技术,成功承担国家级项目,在大语言机器翻译领域取得领先地位。 3、

    06-18

  • 51Talk:一季度营业收入6亿元,同比增长23.3%

    51Talk:一季度营业收入6亿元,同比增长23.3%

    51Talk发布一季度财报。 财报显示,一季度公司实现营业收入6亿元,同比增长23.3%;非GAAP净利润为1万元,去年同期为1万元; GAAP净利润为1万元,去年同期为1万元。

    06-18

  • 对话“奈飞文化”缔造者 -可以从别人身上学到什么好东西?

    对话“奈飞文化”缔造者 -可以从别人身上学到什么好东西?

    组织|陈晨编辑|姚宁夏,一份10页的PPT在硅谷流传,下载量超过1万次。 这张被Facebook首席运营官Sheryl Sandberg称为“硅谷有史以来最重要的”的《奈飞文化集》总结了奈飞企业文化的八项原则,其中包括“只招聘成年人”。 当我第一次读《奈飞文化》时,我总觉得它有一种矛盾的

    06-17

  • 首募16亿元,段兰春回忆凯辉15年成长之路

    首募16亿元,段兰春回忆凯辉15年成长之路

    今日(6月2日),凯辉基金正式宣布旗下人民币成长基金二期已完成首募。 该基金的目标规模为30亿元。 目前,首通规模超过16亿。 凯辉人民币成长基金二期将依托凯辉基金对各行业的深入了解和独特的产业资源优势,持续投资于大消费、工业技术碳中和、大健康三大领域,聚焦成长型

    06-17

  • 校内教师服务工具“原鼎”已完成600万元天使轮融资,金沙江创投

    校内教师服务工具“原鼎”已完成600万元天使轮融资,金沙江创投

    1月2日投资界消息,校内教师服务工具“原鼎”近日完成金沙江创投1万元投资。 元天使轮融资,上海隽泰担任FA。 元鼎CEO王旭表示,本轮融资后,元鼎将继续扩充团队、优化产品体验、加强师资交流、深耕区域市场。   元鼎于今年8月成立。 它是一家教学系统开发商。 推出了日常考

    06-18

  • 互联网瑜伽品牌Wake完成A+轮融资,投资方为三七互娱

    互联网瑜伽品牌Wake完成A+轮融资,投资方为三七互娱

    据投资界5月11日消息,互联网瑜伽品牌Wake完成数千万元A+轮融资,投资方为三七互娱。 投资方为三七互娱。 据Wake创始人&CEO熊明俊介绍,本轮融资将用于自有课程的研发、品牌建设和营销。   此前,Wake曾于2018年9月获得热健身1万元天使轮融资; 2016年7月获得华创资本、华

    06-18

  • 印尼财政部:维持二季度GDP增速预测在7%-8%左右

    印尼财政部:维持二季度GDP增速预测在7%-8%左右

    印尼财政部:维持二季度GDP增速预测在7%-8%左右,但6月份新冠病例上升将影响GDP增长预测。

    06-17