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

In QT, can we have two slots with same name but different arguments?

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

我需要在 class C 中以两种不同的方式处理这些信号。我可以在 class C 中创建两个插槽 void SomeSignal()void SomeSignal(int) 吗?

是的,你可以,但是如果你处理的是来自完全不同 类 的不同东西,那么以不同的方式命名这些插槽会更清楚(请记住,信号名称和链接的插槽名称之间不需要任何关系) .

是的,它是有效的。但是如果你这样做,你需要以不同于使用 Qt 5 连接语法时的正常方式处理连接到 signals/slots。

看下面的问答如何处理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);
  • 似乎必须指定两个模板参数才能连接,因为插槽已过载。