我可以有几个信号一个插槽?(Can I have one slot for several sign

2019-10-20 07:40发布

我有几个按钮,每个按钮与每当点击按钮的信号发射它们的属性中的一个(比方说,一个整数)。 在父类中,我想能够捕捉任何的按钮发出的并反应基于来自按钮特定属性。

我能想到的办法做到这一点通过单独“连接”父类中的每个按钮,但似乎错了,烦琐,因为在我的应用程序添加和删除按钮的部分功能。 我可能考虑这件事错......和建议?

Answer 1:

在Qt您可以连接任何插槽的信号。 这也意味着可以用多个时隙或几个信号以单个槽连接的单个信号。

现在,如果每个按钮做不同的事情,有没有那么多的我会用不同的插槽手动连接每一个只是为了有东西很好地分离。

在你的情况,你可能希望所有的按钮单一插槽连接以自动的方式,并在此插槽确定源头通过按钮self.sender()然后做这个东西的信息。

例:

每当一个新的按钮,在你的widget出现

new_button.clicked.connect(self.parent().buttons_clicked)
# always the same recipient

而在父类:

def buttons_clicked(self):
  button = self.sender()
  # do something useful depending on the button that sent the signal

现在缺少的是在这里您将您的属性(数字或其他)的方式。 你没有指定你怎么做,但现在它大概不会有显著通过连接到相同的时隙改变。


编辑:作为一个旁注,也有在Qt的事件,大致做同样的。 信号/插槽与事件是一个有趣的讨论。 根据您的问题(许多动态按钮),而不是连接和断开你可能会与发送事件更好。



Answer 2:

你可以这样做:

from functools import partial

def buttonEvent(i):
    print(i)

for i in range(5):
    button = QtWidgets.QPushButton("Button: " + str(i))
    button.clicked.connect(partial(buttonEvent, i))

在Qt中,你需要连接信号的功能名称,不能指定参数或任何东西。 这是恼人的,当谈到许多独特部件或部件产生或诸如此类的东西。 两个像样的解决方案是使用部分和lambda。 我用的λ时,我想打电话给带参数的独立变量的函数(如button.clicked.connect(lambda: print("Button clicked")) 如果你的函数调用取决于一些变数,这将在以后改变,你需要使用的部分,这将节省变量内容的时候了。 拉姆达将等待,直到被称为使用该变量(因此,在上述情况下,所有按钮将打印“4”如果使用拉姆达)。



文章来源: Can I have one slot for several signals?