web-dev-qa-db-fra.com

Fonction de connexion QObject

J'ai vérifié d'autres questions similaires et essayé leurs solutions, mais elles ne fonctionnent pas pour moi.

J'essaie essentiellement de créer un client http qui ne fait que des demandes de publication. Pour ce faire, je dois connecter le signal fini de QNetworkManager à un emplacement de rappel.

Voici mon code.

fichier h:

...
public slots:
   void finishedSlot(QNetworkReply* reply);
private:
    QNetworkAccessManager *network_manager;
...

fichier cpp:

...
Class1::Class1(){
    network_manager = new QNetworkAccessManager(this);
    QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *)));
}
...
void Class1::finishedSlot(QNetworkReply* reply)
{
    // some logic with reply
}
...

Comme vous pouvez le voir, l'emplacement est définitivement présent et il est déclaré sous les emplacements publics dans le fichier d'en-tête. Je ne sais donc pas pourquoi cela se produit. J'ai déjà essayé de nettoyer, d'exécuter qmake et de reconstruire.

Le message d'erreur est:

"QObject :: connect: aucun emplacement de ce type QObject :: finishSlot (QNetworkRhness *)"

Une idée?

22
Charlemagne

Vous avez probablement oublié d'utiliser le Q_OBJECT macro. Chaque classe qui implémente ses propres slots/signaux a besoin de cette macro. N'oubliez pas que vous devez ajouter votre fichier d'en-tête/source au fichier .pro.

47
Zeta

Une chose à noter; puisque vous utilisez Qt 5, il y a une nouvelle syntaxe de connexion de slot de signal, qui vous permettra de spécifier n'importe quelle fonction et pas seulement celles définies comme slots.

Dans cette situation, vous pouvez le faire: -

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);

Ce qui est génial avec cette syntaxe, c'est que vous spécifiez simplement l'adresse de la fonction et ne vous souciez pas des paramètres, donc si vous les modifiez dans une fonction, vous n'avez pas besoin de les mettre à jour dans les instructions connect.

Cependant, vous devriez toujours utiliser la macro Q_OBJECT et vous pouvez en savoir plus sur la nouvelle syntaxe ici .

20
TheDarkKnight

Je partage un autre problème possible ici, car ce message est le plus important de la recherche Google.

En plus d'ajouter QObject, vous devez également ajouter public slots: ou public Q_SLOTS: pour votre événement personnalisé. Sinon, vous rencontrerez toujours le QObject::connect: No such slot Erreur.

Je donne un bref résumé ici selon le post de Zeta et l'autre post

Résoudre “No such slot” error, vous devez vérifier ..

  1. Vérifiez si votre classe hérite de QObject ou d'une classe dérivée de QObject
  2. Ajouter une macro QObject dans la définition de classe
  3. Ajoutez slots ou Q_SLOTS après votre mot-clé privé/protégé/public pour votre événement
  4. Si vous cochez 1-3, alors nettoyez , exécutez qmake , et reconstruisez à nouveau pour vous assurer que toutes vos choses dans 1-3 sont générées par moc .

Enfin, un exemple ici:

class MyClass: public QObject { //check 1
     Q_OBJECT //check 2

   public slots: //check 3
     void onEvent(int);
};

J'espère que cela sauve la vie des autres

5
AndersonMeng