Bonjour,
je pose là une question à laquelle mon niveau ne permet pas de répondre (sinon je posterais pas hein)
Je commence l'explication du problème en mode texte, les plus courageux pourront jeter un coup d'oeil au code après (toi qui te sens si bon, avant de sauter au code lis donc ici quand même)
1ere partie : Ze probleume :
1) Je crée une classe Abstraite nommée virtualSensor
2) Dans cette classe je mets la macro Q_OBJECT
3) Je mets aussi uniquement des méthode virtuelles pures qu'on appelera A et B.
4) je crée une classe sensorX, qui dérive de virtualSensor.
5) sensorX réimplémente les méthodes virtuelles A et B ainsi qu'un QComboBox et un slot C
(le QComboBox n'est qu'un exemple)
6) Quelque part dans la définition de A ou B, je connecte le signal du QComboBox à mon slot C(celui de ma classe sensorX).
7) Tout compile sans erreurs ni warnings.
8) A l'execution en debug, je me rends compte que le connect(signal QCombobox à slot C de sensorX) ne fonctionne pas, le message étant que le slotC n'appartient pas à virtualSensor.
Mes questions : en quoi le fait que virtualSensor possède Q_OBJECT et pas sensorX influe-t-il sur ce genre de situation ? Pourquoi connect est allé chercher le slot C dans la classe virtualSensor et pas dans sensorX ?
Vous allez me dire : Mets Q_OBJECT dans sensorX et pas dans la virtualSensor !
Si je fais ça, ça ne compile pas (erreurs dans les moc_*), j'ai les messages suivants (j'abrège) :
Ma solution pour que ça fonctionne est de mettre Q_OBJECT dans virtualSensor ET dans sensorX.warning C4273: 'staticMetaObject' : inconsistent dll linkage
error C2491: 'QWidget::staticMetaObject' : definition of dllimport static data member not allowed
error C2509: 'qt_metacall' : member function not declared in 'virtualSensor'
1ere partie : Ze code :
Finalement, après réflexion je trouve que j'ai suffisament bien expliqué pour ne pas mettre de code
Pour ceux que ça intéresse, voilà ce qu'il y a dans la macro Q_OBJECT :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #define Q_OBJECT \ public: \ Q_OBJECT_CHECK \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ virtual void *qt_metacast(const char *); \ QT_TR_FUNCTIONS \ virtual int qt_metacall(QMetaObject::Call, int, void **); \ private: /* tmake ignore Q_OBJECT */ #define Q_OBJECT_FAKE Q_OBJECT /* tmake ignore Q_GADGET */ #define Q_GADGET \ public: \ static const QMetaObject staticMetaObject; \
Partager