Qt Signal / Slots envoyant une structure complète

J’essaie d’envoyer une structure via des signaux / slots entre deux threads, mes signaux / slots sont connectés correctement et j’ai pu envoyer des QSsortingngs contenant des parties de mes données, mais je dois maintenant envoyer le tout et les structures semblent plus sensées. Cependant, lorsque j’essaie, le signal n’est pas envoyé / reçu. Le problème semble être uniquement avec l’envoi / la réception de la structure, le traitement avant et après de nombreuses tentatives.

Je ne peux pas utiliser de pointeurs tels que ici ou ici car mes données sont générées trop rapidement et la mémoire est écrasée ou libérée (j’ai essayé avec des pointeurs et suppose que les références seraient effectuées de la même manière).

J’ai déjà ajouté le Q_DECLARE_METATYPE à ma structure. Ma structure n’est pour le moment qu’un petit test (à agrandir ultérieurement) et se trouve dans son propre fichier d’en-tête.

#ifndef RETURNSTRUCT_H #define RETURNSTRUCT_H struct Datastruct { int markeridone; }; Q_DECLARE_METATYPE(Datastruct); #endif //RETURNSTRUCT_H 

Pourquoi mon programme pourrait-il être incapable d’envoyer / recevoir des structures? Toute aide est très appréciée.

J’utilise Windows 7, MinGW 32bit, Qt 5.7.0, Qt Creator 4.0.3

Votre journal de débogage devrait vous en avertir – vous ne pouvez envoyer que des types connus du méta-système de qt. En utilisant Q_REGISTER_METATYPE, vous finissez par enregistrer les types associés à l’espace de noms dans lequel la définition a été faite.

Heureusement, vous pouvez dire à Qt votre structure comme ceci:

 // after QApplication was instantiated qRegisterMetaType("Datastruct"); // but before any class is instantiated that connects signals with this type 

Et il ne tentera pas de déduire un espace de noms en regardant le code. Assurez-vous de relancer qmake (ou mieux encore, effectuez un nettoyage), sinon il pourrait être négligé lors de la construction avec QtCreator.

S’il vous arrive par la suite de transmettre des classes de modèles de vos types via des signaux, veillez également à les enregistrer car, même si Qt connaît QList, il ne connaît pas QList de votre type:

 qRegisterMetaType>("QList"); 

Sur une autre note: si vous définissez des alias de classe, assurez-vous de les enregistrer avec leur vrai nom.

 #define std::shared_ptr model_ptr // you can declare your signals like this: void my_signal(model_ptr); // but have to register the type like this: qRegisterMetaType>("std::shared_ptr"); 

En ce moment, vous déclarez la structure connue de QMetaType à l’aide de la macro Q_DECLARE_METATYPE

 struct Datastruct { int markeridone; }; Q_DECLARE_METATYPE(Datastruct) 

vous pouvez envoyer cette structure via QVariant. C’est gentil et simplement. Dans vos en-têtes déclarez:

 signals: void sendDatastruct(QVariant data); public slots: void getDatastruct(QVariant data); 

Utiliser le signal dans votre code:

 ..... Datastruct ds; ..... QVariant data; data.setValue(ds); emit sendDatastruct(data); // now send signal ..... 

Utilisation de la fente:

 void MyObject::getDatastruct(QVariant data) { Datastruct ds = data.value(); ..... // now You can use structure in Your code }