2016-05-25 1 views
0

J'écris un gestionnaire d'abonnement, l'idée est qu'une connexion de signal et d'emplacement est créée et que plusieurs abonnements peuvent être accrochés sur l'emplacement, quand une mise à jour est reçue tous les abonnements à l'emplacement seront notifié des nouvelles données.Wrapping QObject :: erreur de connexion

La question est que dans ma classe qui gère les abonnements I am a une méthode appelée « setupSubscription », voici le prototype:

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

Le type dénombrée eSlotID contient un identifiant unique pour chaque fente, l'idée est que les abonnés précisent l'identifiant pour mettre en place un abonnement.

Son dans les premiers stades de développement et le code pour setupSubscription:

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

Bien sûr, il y a beaucoup plus d'aller encore, mais cela provoque une erreur sur la compilation:

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

Je crois que le prototype est correct ayant fait un pas à travers la connexion dans le débogueur avant de l'emballer dans ma méthode d'installation.

Je ne suis pas sûr de ce que l'erreur signifie que la mise en œuvre de la classe et la correspondance du prototype et sont présents.

Exemple d'utilisation:

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

msSlotSubMngr est une instance de la classe d'abonnement à sous.

Voici le code d'origine avant d'emballage et ce compile sans erreur:

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

Quand je seul ensemble le code de travail, c'est le prototype de la méthode de connexion:

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

Déclaration de eSlotID:

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

prototype slot:

void update2Elevation(float fltValue); 

mise en œuvre à sous:

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

Répondre

0

Trouvé le problème, qui n'avait absolument rien à voir avec les prototypes, mais l'erreur/cause n'a pas été signalée par le compilateur. Il s'est avéré qu'un en-tête obligatoire n'était pas inclus.

0

Vous devez montrer votre code d'appel. À partir du message d'erreur, il semble que vous ayez mal orthographié setupSubscription.

+0

Ce n'est pas une réponse et pas vraiment une option non plus, cela devrait suffire, cela inclut l'implémentation du prototype et de la fonction. – SPlatten

+0

Trois choses sont nécessaires pour trouver l'erreur. Vous avez montré deux d'entre eux. Mais à moins que nous voyions le code appelant, je n'ai aucun moyen de savoir si vous avez passé les arguments corrects au code que vous avez montré. –

+0

Les paramètres passés sont exactement les mêmes que si je devais appeler directement QObject :: connect et cela fonctionne. – SPlatten