qt连接信号中的“通配符”

时间:2012-03-04 21:15:57

标签: qt signals-slots

在Qt中,可以使用以下方法将信号连接到插槽:

connect(x, SIGNAL(S()), y, SLOT(func()));

其中x和y是指向继承自QObject的类的实例的指针。

我正在寻找类似的东西:

connect(*, SIGNAL(S()), y, SLOT(func()));

将发送信号S的任何人连接到y的slot func()。 或者:

connect(C, SIGNAL(S()), y, SLOT(func()));

其中C将设计一个类(不仅是一个实例),这样任何C实例发出的所有信号S都会连接起来。

我认为应该可以使用这些“通配符”而不是“y”:

connect (x, SIGNAL(S()), C, SLOT(func()));

将实例x的信号S连接到C类的任何实例

如何在Qt中做到这一点?

3 个答案:

答案 0 :(得分:1)

我猜测为什么没有神奇的通配符方法将所有信号从类的实例连接到插槽,因为类必须跟踪它的所有实例以迭代它们并建立连接。在调用之后进行连接将要求类在其构造函数的末尾安装一些东西,以便将来的实例也可以获得连接。 总而言之,这将是您对类进行子类化并将其添加到构造函数中的问题。如果您在构造时不知道插槽,则需要让类跟踪实例,以便稍后可以调用您自己的通配符信号插槽连接方法。

答案 1 :(得分:0)

您是否有理由在相关类的构造函数中执行此操作?任何时候你想要对一个类的所有实例做一些事情,这是一个好的开始。让构造函数使用信号(或插槽)获取指向对象的指针,并以正常方式建立连接 - 使用this指针代替xy

答案 2 :(得分:0)

答案在很大程度上取决于有关课程是否在您的控制之下。完全没有办法像你描述的那样进行通配符连接,但是你可以通过使用事件过滤器(对于不属于你自己的类)或者每次收到任何信号时更改类以发出特定信号来获得相同的效果(如果是你自己的话)。如果这些都不起作用,则包装现有类可以允许您添加所需的功能。

简而言之,没有一般解决方案,所以让我们了解具体情况的更多具体细节。