Collegamento di un segnale di QML ad un normale C++ slot è facile:Collegare QML segnale al C++ 11 slot di lambda (Qt 5)
// QML
Rectangle { signal foo(); }
// C++ old-style
QObject::connect(some_qml_container, SIGNAL(foo()), some_qobject, SLOT(fooSlot()); // works!
Tuttavia, non importa quello che cerco, io non riesco a essere in grado per connettersi a uno slot di funzione lambda C++ 11.
// C++11
QObject::connect(some_qml_container, SIGNAL(foo()), [=]() { /* response */ }); // fails...
QObject::connect(some_qml_container, "foo()", [=]() { /* response */ }); // fails...
Entrambi i tentativi falliscono con un errore di firma di funzione (senza QObject :: Connect sovraccarico può accettare questi parametri). Tuttavia, la documentazione Qt 5 implica che ciò dovrebbe essere possibile.
Sfortunatamente, Qt 5 esempi collegano sempre segnale di C++ in un C++ fessura lambda:
// C++11
QObject::connect(some_qml_container, &QMLContainer::foo, [=]() { /* response */ }); // works!
Questa sintassi non può funzionare per un segnale QML, come QMLContainer :: firma foo non è noto al momento della compilazione (e dichiarando che QMLContainer :: pippo a mano sconfigge lo scopo di usare QML in primo luogo.)
È quello che sto cercando di fare? In tal caso, qual è la sintassi corretta per la chiamata QObject :: connect?
Grazie per la risposta, questo mi dà una nuova direzione per cercare una risposta: è possibile ottenere un puntatore C++ su un segnale QML? Se è così, posso associare una funzione std :: al segnale e una lambda allo slot. Sfortunatamente, il mirroring di ogni segnale QML in un QObject in C++ è (discutibilmente) un design peggiore rispetto alla definizione degli slot in QObjects (cioè l'approccio old-school). Quello che vorrei fare è evitare di utilizzare completamente QObjects, sfruttando le nuove interfacce Qt 5 (che potrebbero o non potrebbero essere possibili). –
Bene, il fatto che le connessioni segnale-segnale avvengano automaticamente potrebbe significare che è solo una riga aggiuntiva di codice, qualcosa come questa dopo aver dichiarato il visualizzatore QML: 'MyQMLSignalRouter qmlSignals (& myQmlView.rootObject());' e quindi usa 'qmlSignals' in new stile di collegare le chiamate. I segnali QML non esistono come funzioni C++, non possono (sono dinamici, C++ è statico), quindi ottenere un puntatore del metodo diretto su di essi non è nemmeno teoricamente possibile, a quanto ho capito. – hyde
Il mio scetticismo per questo approccio consiste nello stretto accoppiamento tra i segnali QML e il codice C++ che introduce, così come il singolo approccio "super-classe" (una classe per dichiarare tutti i segnali, ovunque). Ha un cattivo odore! Hai perfettamente ragione che i segnali QML non sono disponibili per C++ staticamente. Tuttavia esiste una soluzione dinamica: QQuickItem :: metaObject() -> indexOfSignal ("foo()") restituisce correttamente l'indice di quel segnale. AFAICT, esiste anche l'impianto idraulico per ottenere un wrapper chiamabile, ma è nascosto all'interno dello spazio dei nomi QtPrivate. Bummer. –