Impossible de connecter le signal de logement dans une autre classe
J'ai 2 classes. De classe A et de Classe B. je suis en émettant un signal de la classe A qui je veux le B à recevoir.
Je le fais de la manière suivante
En Auditeur Fichier
Header File:
Class Listener:public DDSDataReaderListener
{
//Some code
public:
A m_objectSendData;
}
Mise En Œuvre De Fichier:
void Listener::ondataavailable(DDSDataReader *reader)
{
m_objSendData.GetDDSData();
}
Dans La Classe Un
Fichier D'En-Tête:
Class A:public QObject
{
Q_OBJECT
public:
void GetDDSData();
signals:
void Signal_Data();
}
.Fichier cpp
A::A(QWidget *parent):QObject(parent)
{
}
void A::GetDDSData()
{
emit Signal_Data();
}
Dans La Classe B
Header File:
Class B:public QObject
{
Q_Object
public:
A objGetData;
public slots:
void getData();
}
Implementation File:
B::B(QWidget *parent):QObject(parent)
{
//Some part of code
connect(&objGetData,SIGNAL(Signal_Data()),this,SLOT(getData());
}
void B::getData()
{
//Watever is to be updated
}
J'ai essayé de débogage. Il va jusqu'à émettre de la partie correctement. Cependant, il n'est pas d'atteindre la fente.
Quelqu'un peut-il m'aider avec cela.
Merci.
Recevez-vous des messages comme
Non, il n'est pas en montrant un tel message
Eh bien, je ne vois rien de mal dans le code que vous avez posté ci-dessus, sauf pour le manque
vérifier la valeur booléenne
Une chose de plus, vous ne montrez pas assez de code, mais je suspecte que vous programme champ d'application de feuilles de
Object::connect: No such slot B::SlotB()
lorsque vous exécutez votre application?Non, il n'est pas en montrant un tel message
Eh bien, je ne vois rien de mal dans le code que vous avez posté ci-dessus, sauf pour le manque
)
avant ;
dans votre connect
déclaration, mais qui n'est évidemment pas manquer dans votre code.vérifier la valeur booléenne
connect
retourne. Si c'est true
alors la connexion a été un succès et que vous n'émet pas de signal. Si elle renvoie false
puis vérifiez réponse @Merlin069 a vous a donné.Une chose de plus, vous ne montrez pas assez de code, mais je suspecte que vous programme champ d'application de feuilles de
objectA
variable et votre émettant objet est détruit avant de pouvoir émettre un signal (objectA
est variable locale créé sur la pile pas sur le tas).OriginalL'auteur Sid411 | 2013-08-07
Vous devez vous connecter pour publier un commentaire.
Sans code complet, c'est assez difficile d'identifier la cause exacte du problème, donc je vais vous expliquer quelques points importants à vérifier.
Pour vous assurer que vous pouvez utiliser les signaux et les slots mécanisme, vous devez vous assurer que votre classe est dérivée de QObject, ou à une classe déjà dérivée de QObject dans sa hiérarchie et de votre classe doit contenir la macro q_object, par exemple: -
L'omission de la macro est probablement la plus fréquente d'erreurs.
Pour spécifier un emplacement, vous l'ajouter à la sphère publique ou privée fente section de votre classe: -
Une fois qu'un signal est déclarée dans une classe, une fente pour recevoir le signal doit correspondre au passage d'arguments et lorsque vous vous connectez un signal à un slot, vous ne devez pas ajouter l'argument de fonction des noms.
Donc: -
Il convient de: -
Enfin, si vous êtes à l'aide de Qt 5, vous pouvez utiliser la nouvelle connexion d'appel, qui n'exige pas de vous de spécifier n'importe quel argument, mais au contraire prend les adresses de l'emplacement et les fonctions de signaux.
Puisqu'il fait référence à l'adresse d'une fonction, en réalité, les fonctions n'ont pas besoin d'être classé comme une machine à sous et sera toujours appelé.
Espère que ça aide.
Alors pouvez-vous s'il vous plaît ajouter plus de code à la question, tels que les fichiers d'en-tête où vous déclarez les slots et signaux. Notez également que lorsque vous exécutez votre application avec un débogueur et un appel de connexion échoue, un message d'erreur est affiché dans la fenêtre de sortie. Merci de poster aussi.
Je vais vous expliquer le scénario en entier ce que je fais. Je vais avoir un DDS auditeur de là où je suis l'appel de l'intervalle QT fonction. À partir de cette fonction, je suis en émettant un signal qui va à mon thread Principal fente. Ici je mettre à jour les valeurs provenant de la DDS. J'ai inclus tous les fichiers d'en-tête et il n'y a pas grand chose à écrire dans le code. Il est exactement comme je l'ai écrit. Seul ajout que je peux faire est dans mon écouteur je suis entrain de créer un objet de la classe A et l'appel de la fonction. C'est la seule chose que je fais dans l'Écouteur. Et pendant le débogage, il est dit Arrêté au point d'arrêt de trois qui est à l'instruction de connexion.
Je suis désolé, mais si vous dites que vous avez inclus tous votre code, de toute évidence, vous n'avez pas qu'il n'y a pas de définition de la classe, pas de macro q_object, pas de signaux ou de logement les étiquettes, etc. Alors que vous pouvez supposer que vous avez fourni toutes les informations nécessaires, il ne suffit pas d'aller ici. Plutôt que de votre question, en indiquant, par exemple, "Dans la classe...", vous devez indiquer le code pour nous de comprendre son contexte et de vous aider avec le problème que vous rencontrez. Je pourrais vous montrer le code "a = 4" et dites-vous que c'est en panne, mais sans savoir ce que 'a' est, et ses environs, code, vous n'avez aucune idée de pourquoi.
OriginalL'auteur TheDarkKnight
Fait, je crois que la réponse est donnée dans l'un des commentaires.
vous allouer de l'Objet sur la pile, de sorte qu'il est détruit dès qu'il est hors de portée, en collaboration avec le détruire est déconnecté de tous les signaux/slots il a des connexions à la.
C'est pourquoi vous ne voyez pas toutes les erreurs/messages d'avertissement parce que le code lui-même est complètement légitime. Vous devriez new() de votre objet pour l'obtenir alloué dans le tas.
Je pense que le problème est donc de ma classe moyenne n'est pas une classe singleton. Je vais essayer de faire ça singleton et ensuite modifier la solution ici...
OriginalL'auteur evilruff