包装 QObject::connect 错误

Posted

技术标签:

【中文标题】包装 QObject::connect 错误【英文标题】:Wrapping QObject::connect error 【发布时间】:2016-05-25 10:47:47 【问题描述】:

我正在编写一个订阅管理器,其想法是创建信号和插槽连接,并且可以在插槽上挂钩多个订阅,当收到更新时,将通知插槽的所有订阅新数据。

问题是,在我管理订阅的类中,我有一个名为“setupSubscription”的方法,这是原型:

    void setupSubscription(enum eSlotID ID
                          ,const QObject* pobjSender
                          ,const QMetaMethod& pobjSignal
                          ,const QMetaMethod& pobjSlot);

枚举类型 eSlotID 包含每个插槽的唯一 ID,其想法是订阅者只需指定 ID 即可设置订阅。

它处于开发的早期阶段和setupSubscription的代码:

    void clsSlotSub::setupSubscription(enum eSlotID ID
                                      ,const QObject* pobjSender
                                      ,const QMetaMethod& pobjSignal
                                      ,const QMetaMethod& pobjSlot) 
        QObject::connect(pobjSender, pobjSignal, this, pobjSlot);
    

当然还有很多事情要做,但这会导致编译错误:

    error: no matching function for call to 'clsSlotSub::setupSubscription(clsSlotSub::eSlotID, Fcs::Mount*, void (Fcs::Mount::*)(Fcs::qfloat32), void (clsSlotSub::*)(float))'
                                ,&clsSlotSub::update2Elevation);
                                                              ^

我相信原型在调试器中单步执行连接是正确的,然后再将其包装到我的设置方法中。

我不确定这个错误意味着什么,因为类实现和原型匹配并且存在。

使用示例:

    msSlotSubMngr.setupSubscription(clsSlotSub::ELEVATION_ANGLE
                                   ,Fcs::Mount::GetRef()
                                  ,&Fcs::Mount::signalElevation
                                  ,&clsSlotSub::update2Elevation);

msSlotSubMngr 是槽订阅类的一个实例。

这是包装前的原始代码,编译时没有任何错误:

    QObject::connect(Fcs::Mount::GetRef()
                    ,&Fcs::Mount::signalElevation
                    ,mpobjElevStrip
                    ,&clsElevStrip::elevationChanged);

当我单独设置工作代码时,这是连接方法的原型:

     static QMetaObject::Connection connect(const QObject *sender
                                           ,const QMetaMethod &signal
                                           ,const QObject *receiver
                                           ,const QMetaMethod &method
                                           ,Qt::ConnectionType type = Qt::AutoConnection);

eSlotID 声明:

    enum eSlotID 
    ...
    /*1003*/   ,ELEVATION_ANGLE
    ...
    ;

插槽原型:

    void update2Elevation(float fltValue);

插槽实现:

    void clsSlotSub::update2Elevation(float fltValue) 
        qDebug() << "clsSlotSub::New elevation: " << fltValue;
    

【问题讨论】:

【参考方案1】:

您需要显示您的调用代码。从错误消息来看,您似乎只是拼错了 setupSubscription。

【讨论】:

这不是一个答案,也不是一个真正的选择,这应该足够了,它包括原型和功能实现。 找到错误需要三件事。你展示了其中的两个。但是除非我们看到调用代码,否则我无法知道您是否将正确的参数传递给您显示的代码。 传递的参数和我直接调用QObject::connect完全一样,这样就可以了。 看起来您在调用代码中拼错了函数名称。如果您发布了它,这将是显而易见的。 你在说什么?我没有拼错调用者匹配的任何内容。【参考方案2】:

发现了与原型完全无关的问题,但是编译器没有报告错误/原因。结果发现没有包含所需的标头。

【讨论】:

以上是关于包装 QObject::connect 错误的主要内容,如果未能解决你的问题,请参考以下文章

QObject::connect: 没有这样的信号错误 C++

Pyqt5 多线程错误:QObject::connect: 无法对“QTextCursor”类型的参数进行排队

将 lambda 函数作为第三个参数传递给 QObject::connect 时出错

QObject::connect 和模板导致问题

QObject::connect: 没有这样的信号(类名)(信号名)(属性)

Qt error ------ no matching function for call to QObject::connect(QSpinBox*&, <unresolved ove