【问题标题】:In QT, can we have two slots with same name but different arguments?在 QT 中,我们可以有两个名称相同但参数不同的插槽吗?
【发布时间】:2016-08-05 07:08:27
【问题描述】:

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

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

【问题讨论】:

    标签: c++ qt signals-slots


    【解决方案1】:

    是的,它是有效的。但是如果你这样做,你需要以不同于使用 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);
    
    • 似乎必须指定两个模板参数才能连接,因为插槽已重载。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢@Matteo Italia。
    • 只是超载了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多