gpt4 book ai didi

python - 在pyqt的for循环中连接多个信号/槽

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:34 27 4
gpt4 key购买 nike

我在 PyQt 中使用 for 循环 连接多个信号/槽。代码如下:

# 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 点击 signalscan_callback slot 并发送字符串 phase 作为 slot 的参数。 etalonmirrorgain 也是如此。

我得到的:

  • 出于某种原因,我的函数总是传递字符串 gain 作为所有按钮的参数。不确定我是不是很愚蠢(可能)还是这是一个错误。

作为引用,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 中迭代多个小部件的首选方法是将它们作为对象存储在列表中。

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”,您可以将它们存储在另一个列表中,或者像这样创建一个字典

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 的值就被永久存储了。

关于python - 在pyqt的for循环中连接多个信号/槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com