2017-06-14 1 views
1

Je tente de connecter un signal d'un QObject à un foncteur tel que défini dans la documentation QT5:connexion (QObject *, SIGNAL (signal()), foncteur) ne se connecte pas à QT5

http://doc.qt.io/qt-5/qobject.html#connect-5

Code pertinent:

namespace someNamespace 
{ 
void processFinished() 
{ 
    qDebug() << "A Thread has finished processing!!!"; 
} 

void executeWorkerOnSeparateTread() 
{ 
    QThread* thread = new QThread; 
    Worker* worker = new Worker(); 
    worker->moveToThread(thread); 
    QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit())); 
    QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater())); 
    QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
    QObject::connect(thread, SIGNAL(started()), worker, SLOT(process())); 
    QObject::connect(worker, SIGNAL(finished()), processFinished); //DOES NOT COMPILE 
    thread->start(); 
} 
} 

Si je devais commenter simplement la ligne qui ne compile pas, ce code compile et exécute sans problème. Je ne peux pas obtenir cette connexion pour compiler.

erreur du compilateur:

no matching function for call to 'QObject::connect(Worker*&, const char*, void(&)())' 

bien sûr des travailleurs et a QObject hérite le mot-clé Q_OBJECT en elle. le fait que cela fonctionne sans la ligne problématique élimine également d'autres lignes étant le problème.

Des idées sur ce que je fais mal ?? Il me semble que ça devrait être aussi simple.

Le cas échéant, la version QT est 5.8 et la version GCC est 4.8.5.

Merci!

+5

Pas une réponse à votre problème, juste un commentaire: pourquoi n'utilisez-vous pas la nouvelle syntaxe 'connect' vérifiée à la compilation? Vous utilisez un Qt assez nouveau pour qu'il soit disponible. Débarrasserait des macros 'SIGNAL' et' SLOT' moche et vous donnerait des erreurs de temps de compilation plutôt que des erreurs de temps d'exécution quand une connexion ne peut pas être faite. –

+1

@JesperJuhl En fait, je pense que c'est la réponse. En regardant les docs, la fonction statique 'connect()' qui prend un foncteur n'a pas de version qui supporte l'ancienne syntaxe signal/slot. – MrEricSir

+0

@MrEricSir Je vais soumettre comme la réponse, alors nous verrons comment il est jugé;) –

Répondre

2

C'est vrai, il n'y a aucun moyen de se connecter à une fonction dans un espace de noms ou un lambda en utilisant les signaux et les slots basés sur moc. Jetez un oeil à the list of overloads for QObject::connect()` pour voir pourquoi l'erreur est signalée telle qu'elle est. La fonction correcte à utiliser ici est connect overload for a functor et il utilise un pointeur vers une fonction membre comme premier argument:

QMetaObject::Connection 
QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor) 

Ainsi, l'utilisation:

QObject::connect(worker, &Worker::finished, processFinished); 

Notez l'absence d'accolades rondes après les noms de fonction - être négligent avec ça m'a causé des maux de tête dans les jours.

Cela signifie également que vous voudrez peut-être passer à la nouvelle syntaxe pour des raisons d'uniformité. Pour plus de détails, référez-vous à part 1 et part 2 de la série des articles de blog par Olivier Goffart, l'auteur de la nouvelle syntaxe des signaux et des emplacements. Voir également un détail détaillé côte à côte des deux approches here.

2

Utilisez la nouvelle syntaxe de connexion vérifiée à la compilation. Vous utilisez un Qt assez nouveau pour qu'il soit disponible. Se débarrasser des macros moche SIGNAL et SLOT et vous donnera des erreurs de temps de compilation plutôt que des erreurs d'exécution quand une connexion ne peut pas être faite et cela fonctionnera avec une fonction lambda et membre et la plupart des autres callables ainsi.

+0

Cette réponse est également correcte, et fondamentalement la même que la réponse que j'ai acceptée.Je vais passer à la nouvelle syntaxe à partir de maintenant car elle semble supérieure à l'ancienne de toute façon. Merci! –