You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.5 KiB
96 lines
2.5 KiB
--- |
|
title: 关于PyQt的connect传入lambda函数作为参数调用槽函数的一点思考 |
|
date: 2023-09-25 21:53:35 |
|
updated: 2023-09-26 21:51:14 |
|
tags: |
|
categories: |
|
keywords: Python |
|
description: |
|
top_img: |
|
comments: |
|
cover: |
|
toc: |
|
toc_number: |
|
toc_style_simple: |
|
copyright: |
|
copyright_author: |
|
copyright_author_href: |
|
copyright_url: |
|
copyright_info: |
|
katex: |
|
aside: |
|
--- |
|
|
|
## 关于lambda表达式 |
|
|
|
#### 当处于循环中的时候,以下四种情况返回值不符合预期的原因: |
|
|
|
1. button.clicked.connect(lambda: self.change_status(row_idx)) # 不行, 每次都是传入最新值 |
|
|
|
解读: |
|
|
|
每次循环,lambda都是一个预定义的函数,并没有执行。等价如下: |
|
|
|
```python |
|
def 匿名函数(): |
|
self.change_status(row_idx) # 其中row_idx是外部变量 |
|
``` |
|
|
|
因此,循环的结果就是相当于定义了多个无参的、使用外部参数计算结果的函数。 |
|
|
|
2. button.clicked.connect(lambda r=row_idx: self.change_status(r)) # 不行, 每次都传入False |
|
|
|
解读: |
|
|
|
每次循环定义一个带有默认参数的函数,并没有执行。等价如下: |
|
|
|
```python |
|
def 匿名函数(r=row_idx): |
|
self.change_status(r) # 其中row_idx是外部变量 |
|
``` |
|
|
|
因此,如果循环了很多遍。再调用这个函数: |
|
|
|
```python |
|
# 第一种 |
|
匿名函数() # 这种调用形式相当于默认参数, 此时的r等于定义函数的时候给的默认值 |
|
|
|
# 第二种 |
|
匿名函数(r) # r在最后一次循环的时候, 已经被最新的row_idx值覆盖了。再传就是新值。 |
|
``` |
|
|
|
|
|
|
|
3. button.clicked.connect(lambda checked, r=row_idx: self.change_status(r)) # 行 |
|
|
|
解读: |
|
|
|
每次循环定义一个带有一个参数checked, 一个默认参数r的函数。等价如下: |
|
|
|
```python |
|
def 匿名函数(checked, r=row_idx): |
|
self.change_status(r) # 其中row_idx是外部变量 |
|
``` |
|
|
|
此时调用,必须传入checked: |
|
|
|
```python |
|
匿名函数(arg) |
|
``` |
|
|
|
此时必须传入一个参数,实际上传入的参数覆盖了checked的值,并没有覆盖r的值,r还是等于定义函数的时候的默认值。 |
|
|
|
4. button.clicked.connect(partial(self.change_status, row_idx)) # 行 |
|
|
|
解读: |
|
|
|
定义函数的时候设置默认值,不接受传入值。 |
|
|
|
|
|
|
|
## 总结: |
|
|
|
pyqt在此处出现不符合预期的情况可能是: |
|
|
|
- qt的connect不能传入参数。只能接受信号量携带过来的。 |
|
- 实际使用过程中,有传参的情况,会被传入一个值False。比如上述第二种情况,而第三种情况checked被赋值为False,r不受影响。
|
|
|