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

sky*_*ash 4 c++ qt signals-slots

我有两个信号具有相同名称的两个不同的未来classes A和B成class C.让我们void SomeSignal()来自class A没有任何争论的信号.我有另一个void SomeSignal(int)来自另一个班级的信号.

我需要以两种不同的方式处理这些信号class C.我可以让两个插槽void SomeSignal()和void SomeSignal(int)在class C?

CJC*_*ink 8

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

请查看以下有关如何处理连接到过载信号和插槽的问题和答案

简而言之,连接为:

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

或者,如果您使用的是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);
Run Code Online (Sandbox Code Playgroud)
  • 似乎必须指定两个模板参数才能连接,因为插槽已经过载.