QObject::connect: Pas de file d'attente des arguments de type 'int&"
J'ai essayé de faire ceci :
connect(this, SIGNAL(signalClicked(int&)), classA, SLOT(doWork(int&)));
Mais je reçois le message dans le titre.
J'ai donc exploré l'internet et j'ai trouvé cette solution qui ne fonctionne pas:
qRegisterMetaType<int&>("Type");
connect(this, SIGNAL(signalClicked(Type)), classA, SLOT(doWork(Type)));
Error: no matching function for call to ‘qRegisterMetaType(const char[5])’
Toutes les solutions?
Avez-vous
Oui je le fais, c'est pourquoi je ne comprends pas...
Merci pour votre réponse mais j'ai déjà trouvé cette solution ici qtforum.org/article/36440/... et malheureusement cela ne fonctionne toujours pas.
Où est votre
En fonction de l'intervalle Qt docs pour qRegisterMetaType "Toute classe ou structure qui dispose d'un constructeur par défaut public, un constructeur de copie et un public destructeur peut être enregistré.", qui suggère qu'il est seulement pour les classes et les structures. Quelqu'un pourrait me corriger, mais je ne pense pas que vous devriez être avoir besoin de vous inscrire le type int&.
#include <QMetaType>
?Oui je le fais, c'est pourquoi je ne comprends pas...
Merci pour votre réponse mais j'ai déjà trouvé cette solution ici qtforum.org/article/36440/... et malheureusement cela ne fonctionne toujours pas.
Où est votre
Q_DECLARE_METATYPE
?En fonction de l'intervalle Qt docs pour qRegisterMetaType "Toute classe ou structure qui dispose d'un constructeur par défaut public, un constructeur de copie et un public destructeur peut être enregistré.", qui suggère qu'il est seulement pour les classes et les structures. Quelqu'un pourrait me corriger, mais je ne pense pas que vous devriez être avoir besoin de vous inscrire le type int&.
OriginalL'auteur Thibel | 2013-06-13
Vous devez vous connecter pour publier un commentaire.
Si Qt est d'essayer de file d'attente de la arguments qui signifie que la connexion entre les threads. Cela ne fonctionnera pas pour les non-const références.
Vous pouvez utiliser un reference_wrapper pour contourner ce problème, mais je suggère fortement que vous reconsidérer votre conception. La transmission de valeurs par référence dans le rapport signal/slot connexions n'est pas une bonne idée.
allongement de l'intervalle Qt copies de l'objet, laquelle n'est pas une bonne idée pour passer des valeurs par référence?
Si Qt prend une copie, ce qui est le point de passage (non-const) de référence? Le connecteur de réception ne serait pas en mesure de modifier l'original de toute façon (tout en étant d'induire en erreur en pensant qu'il pourrait). De plus, le point derrière Qt signaux/slots, c'est que le signal de l'émetteur ne sait pas ce qui s'y rattache, ou le nombre de connexions. Si il y a deux connectés machines à sous, et ils ont tous les deux essayer de modifier l'objet qui a été passé par référence alors vous avez toutes sortes de potentiel pour les bugs. Il travaillera, dans des situations limitées, avec des non-file d'attente de connexions, mais c'est toujours une mauvaise conception.
Vous pourriez tout simplement émettre un signal dans la principale qui passe à la valeur d'un argument à un emplacement de votre thread à chaque fois que vous changez la valeur de cette variable. Notez aussi que vous ne pouvez pas passer d'un non-const de référence comme argument dans les signaux et les slots lors de l'utilisation d'une file d'attente de connexion.
Je vois votre point de vue sur la déclaration trompeuse. Si l'on souhaite passer par référence, l'utilisation de QMutex afin de prévenir les problèmes à partir de plusieurs auditeurs modifiant les données permettrait de protéger de problèmes. Ceci, cependant universitaire est parce que dans QMetaObject::activer, si le type de connexion est AutoConnection et de l'expéditeur et le destinataire se trouvent dans des threads différents, la valeur est copiée. Voir ici: woboq.com/blog/how-qt-signals-slots-work.html
OriginalL'auteur Dan Milburn