在QT中,我们可以有两个名称相同但参数不同的插槽吗
In QT, can we have two slots with same name but different arguments?
我有两个名称相同的信号,来自两个不同的classes
A
和B
进入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);
- 似乎必须同时指定两个模板参数才能连接,因为插槽已过载
是的,你可以,但如果你处理的是来自完全不同类的不同东西,那么以不同的方式命名这些插槽会更清楚(记住,信号名称和链接的插槽名称之间不需要任何关系)。
相关文章:
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Qt moveToThread,带有参数的信号/插槽
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- Qt C++:静态断言失败:信号和插槽参数不兼容
- QMetaObject::invokeMethod的插槽参数
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 在插槽中传递多个参数
- 这是在Qt信号和插槽中使用参数调用函数的好方法吗?
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- 插槽(指向方法成员的指针)作为 SIP 中方法的参数
- Qt - 使用λ函数修改先前连接信号的插槽参数
- QTIMER,参数化插槽
- Qt信号和插槽:是复制的参考参数
- 将多个参数传递给插槽
- 插槽比信号提供的参数少,如何?-QT
- Qt 5将带有参数的插槽分配给QPushButton
- 将自定义参数传递到Qt/C++中的插槽
- 在 qt 中传递带有信号和插槽的参数
- Qt插槽参数已损坏
- Qt:从一个对象发出相同的信号,但参数不同;插槽通过接收的参数进行区分