2017-06-14 2 views
1

Ich versuche, ein Signal von einem QObject zu einer Funktors zu verbinden, wie in der QT5 Dokumentation definiert:connect (QObject *, Signal (Signal()), Funktors) Verbinden nicht in QT5

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

relevante Code:

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(); 
} 
} 

Wenn ich nur die Zeile auszukommen waren, die nicht kompiliert, dieser Code kompiliert und ausgeführt ohne Probleme. Ich kann diese Verbindung nicht zum Kompilieren bekommen.

Compilerfehler:

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

natürlich Worker erbt QObject und hat das Q_OBJECT Schlüsselwort in ihm. Die Tatsache, dass dies ohne die problematische Linie funktioniert, eliminiert auch andere Linien, die das Problem darstellen.

Irgendwelche Ideen, was ich falsch mache ?? Es scheint mir, als sollte es so einfach sein.

Falls relevant, ist QT Version 5.8 und GCC Version 4.8.5.

Danke !!

+5

Keine Antwort auf Ihr Problem, nur ein Kommentar: Warum verwenden Sie nicht die neue Kompilierzeit-checked 'connect'-Syntax? Du verwendest ein neues genug Qt, dass es verfügbar ist. Würde die hässlichen 'SIGNAL'- und' SLOT'-Makros loswerden und Ihnen Kompilierungszeitfehler geben, anstatt Laufzeitfehler, wenn eine Verbindung nicht hergestellt werden kann. –

+1

@JesperJuhl Eigentlich denke ich, dass _is_ die Antwort ist. Wenn man sich die Docs anschaut, hat die statische Funktion 'connect()', die einen Funktor verwendet, keine Version, die die alte Signal/Slot-Syntax unterstützt. – MrEricSir

+0

@MrEricSir Ich werde es als die Antwort einreichen, dann werden wir sehen, wie es beurteilt wird;) –

Antwort

2

Das ist richtig, es gibt keine Möglichkeit, eine Verbindung zu einer Funktion in einem Namensraum oder einem Lambda unter Verwendung der moc-basierten Signale und Steckplätze herzustellen. Werfen Sie einen Blick auf the list of overloads for QObject::connect()`, um zu sehen, warum der Fehler so berichtet wird, wie er ist. Die korrekte Funktion hier zu verwenden ist connect overload for a functor und es wird einen Zeiger auf eine Member-Funktion als erstes Argument:

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

So Einsatz:

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

Hinweis den Mangel an runden Klammern nach Funktionsnamen - Unachtsam zu sein, verursachte mir damals einige Kopfschmerzen.

Das bedeutet auch, dass Sie aus Gründen der Einheitlichkeit auf die neue Syntax umstellen möchten.

Weitere Informationen finden Sie in der Blogpostserie von Olivier Goffart, dem Autor der neuen Signal- und Slot-Syntax, unter part 1 und part 2. Siehe auch einen detaillierten Nebeneinander-Überblick der beiden Ansätze here.

2

Verwenden Sie die neue Kompilierungszeit-überprüfte Verbindungssyntax. Du verwendest ein neues genug Qt, dass es verfügbar ist. Wird die hässlichen SIGNAL und SLOT Makros loswerden und Ihnen Kompilierungszeit Fehler anstatt Laufzeitfehler geben, wenn eine Verbindung nicht hergestellt werden kann, und dies wird mit einer Lambda und Member-Funktion und den meisten anderen callables funktionieren.

+0

Diese Antwort ist auch richtig und im Grunde das gleiche wie die Antwort, die ich akzeptierte.Ich werde von nun an auf die neue Syntax wechseln, da sie sowieso der alten überlegen ist. Vielen Dank! –

Verwandte Themen