包装QObject::连接错误

Wrapping QObject::connect error

本文关键字:错误 连接 包装 QObject      更新时间:2023-10-16

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

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

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

发现了与原型完全无关的问题,但编译器没有报告错误/原因。事实证明,所需的页眉不包括在内。