在QT中,我们可以有两个具有相同名称但不同参数的插槽吗?

时间:2016-08-05 07:08:27

标签: c++ qt signals-slots

我有两个同名的信号来自两个不同的classes ABclass C。让void SomeSignal()是来自class A的信号,没有任何参数。我有另一个来自另一个班级的信号void SomeSignal(int)

我需要在class C中以两种不同的方式处理这些信号。我可以在void SomeSignal()中制作两个广告位void SomeSignal(int)class C吗?

2 个答案:

答案 0 :(得分:7)

是的,它是有效的。但是如果你这样做,你需要处理与使用Qt 5连接语法时的正常方式不同的信号/插槽连接。

请查看以下有关如何处理connecting to overloaded signals and slots

的问题和答案

简而言之,请连接为:

connect(a, &A::SomeSignal, this, static_cast<void (C::*)(void)>(&C::SomeSlot));
connect(b, &B::SomeSignal, this, static_cast<void (C::*)(int)>(&C::SomeSlot));

或者,如果您使用的是Qt 5.7,请使用qOverload辅助函数。

编辑:使用显式模板参数@TobySpeight指出:

QObject::connect<void(A::*)(), void(C::*)()>(&a, &A::SomeSignal, &c, &C::SomeSlot);
QObject::connect<void(B::*)(int), void(C::*)(int)>(&b, &B::SomeSignal, &c, &C::SomeSlot);
  • 似乎必须指定两个模板参数才能连接,因为插槽已经过载。

答案 1 :(得分:1)

是的,你可以,但是如果你正在处理来自完全不同类的不同东西,那么更明确地命名这些插槽(请记住,信号名称和链接的插槽名称之间不需要关系)。