在pyqt的for循环中连接多个信号/插槽 [英] Connecting multiples signal/slot in a for loop in pyqt

查看:40
本文介绍了在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点击signalscan_callback slot并发送字符串phase 作为 slot 的参数.标准具mirrorgain也是如此.
  • Connect button phase_scan_button clicked signal to the scan_callback slot and send the string phase as a parameter to the slot. The same for etalon, mirror and gain.

我得到了什么:

  • 出于某种原因,我的函数总是将字符串 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.

这篇关于在pyqt的for循环中连接多个信号/插槽的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆