包装QObject :: connect错误

时间:2016-05-25 10:47:47

标签: c++ qt5.6

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

问题是,在我管理订阅的类中,我有一个名为'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);

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

     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;
    }

2 个答案:

答案 0 :(得分:0)

您需要显示您的主叫代码。从错误消息中,您看起来只是拼错了setupSubscription。

答案 1 :(得分:0)

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