在pyqt的for循环中连接多个信号/插槽
我在 PyQt 中使用 for 循环
连接多个信号/插槽.代码如下:
I'm connecting multiple signal/slots using a for loop
in PyQt. The code is bellow:
# Connect Scan Callbacks
for button in ['phase', 'etalon', 'mirror', 'gain']:
getattr(self.ui, '{}_scan_button' .format(button)).clicked.connect(
lambda: self.scan_callback(button))
我的期望:
- 连接按钮
phase_scan_button
点击signal
到scan_callback
slot
并发送字符串phase
作为slot
的参数.标准具
、mirror
和gain
也是如此.
- Connect button
phase_scan_button
clickedsignal
to thescan_callback
slot
and send the stringphase
as a parameter to theslot
. The same foretalon
,mirror
andgain
.
我得到了什么:
- 出于某种原因,我的函数总是将字符串
gain
作为参数传递给所有按钮.不确定我是愚蠢(可能)还是错误.
- For some reason my functions is always passing the string
gain
as parameter for all the buttons. Not sure if I'm being stupid (likely) or it is a bug.
参考,slot
方法:
def scan_callback(self, scan):
print(scan) # Here I always get 'gain'
if self.scanner.isWorking:
self.scanner.isWorking = False
self.scan_thread.terminate()
self.scan_thread.wait()
else:
self.scanner.isWorking = True
self.scan_thread.start()
getattr(self.ui, '{}_scan_button' .format(
scan)).setText('Stop Scan')
getattr(self, '_signal{}Scan' .format(scan)).emit()
在 pyqt 中迭代多个小部件的首选方式是将它们作为对象存储在列表中.
My preferred way of iterating over several widgets in pyqt is storing them as objects in lists.
myButtons = [self.ui.phase_scan_button, self.ui.etalon_scan_button,
self.ui.mirror_scan_button, self.ui.gain_scan_button]
for button in myButtons:
button.clicked.connect(lambda _, b=button: self.scan_callback(scan=b))
如果你需要单独的字符串phase"、etalon"、mirror"和gain",你可以将它们存储在另一个列表中,或者像这样创建一个字典
If you need the strings "phase", "etalon", "mirror" and "gain" separately, you can either store them in another list, or create a dictionary like
myButtons_dict = {"phase": self.ui.phase_scan_button,
"etalon": self.ui.etalon_scan_button,
"mirror": self.ui.mirror_scan_button,
"gain": self.ui.gain_scan_button}
for button in myButtons_dict:
myButtons_dict[button].clicked.connect(lambda: _, b=button self.scan_callback(scan=b))
请注意,我如何使用带有实体变量的 lambda 表达式,然后将这些变量传递给函数 self.scan_callback
.这样,button
的值就被永久保存了.
Note, how I use the lambda expression with solid variables that are then passed into the function self.scan_callback
. This way, the value of button
is stored for good.