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

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

本文关键字:参数 插槽 两个 我们 QT      更新时间:2023-10-16

我有两个名称相同的信号,来自两个不同的classes AB进入class C。设void SomeSignal()是来自class A的无任何自变量的信号。我有另一个来自另一个班的信号void SomeSignal(int)

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

是的,它是有效的。但是,如果您这样做,那么在使用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));

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

编辑:使用如下@TobyPeight所指出的显式模板参数:

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);
  • 似乎必须同时指定两个模板参数才能连接,因为插槽已过载

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