Podłączanie sygnału QML do zwykłego C++ gniazdo jest łatwe:Połącz QML sygnał do C++ 11 gniazda lambda (Qt 5)
// QML
Rectangle { signal foo(); }
// C++ old-style
QObject::connect(some_qml_container, SIGNAL(foo()), some_qobject, SLOT(fooSlot()); // works!
Jednak bez względu na to, co staram, nie wydaje się być w stanie podłączyć do gniazda funkcji lambda C++ 11.
// C++11
QObject::connect(some_qml_container, SIGNAL(foo()), [=]() { /* response */ }); // fails...
QObject::connect(some_qml_container, "foo()", [=]() { /* response */ }); // fails...
Obie próby nie powiodą się z błędem sygnatury funkcji (nie QObject :: połączyć przeciążenie może zaakceptować te parametry). Jednak dokumentacja Qt 5 sugeruje, że powinno to być możliwe.
Niestety, Qt 5 przykłady zawsze podłączyć sygnał C++ do C++ gniazdo lambda:
// C++11
QObject::connect(some_qml_container, &QMLContainer::foo, [=]() { /* response */ }); // works!
składnia ta nie może pracować na sygnał QML jako QMLContainer :: podpis foo nie jest znany w czasie kompilacji (i deklarowanie QMLContainer :: foo ręcznie eliminuje cel używania QML w pierwszej kolejności.)
Czy staram się to zrobić? Jeśli tak, jaka jest prawidłowa składnia wywołania QObject :: connect?
Dzięki za odpowiedź, daje mi to nowy kierunek poszukiwania odpowiedzi: czy możliwe jest uzyskanie wskaźnika C++ do sygnału QML? Jeśli tak, mogę powiązać funkcję std :: z sygnałem i lambda do gniazda. Niestety, tworzenie kopii lustrzanej każdego sygnału QML do obiektu C++ QObject jest (prawdopodobnie) gorszym projektem niż definiowanie samych szczelin w obiektach QObject (tj. Podejście staroświeckie). Chciałbym tylko całkowicie unikać QObjects, korzystając z nowych interfejsów Qt 5 (co może, ale nie musi być możliwe). –
Cóż, połączenie sygnałów i sygnałów stanie się automatyczne, może oznaczać, że jest to tylko jedna linia kodu, coś w rodzaju linii po zadeklarowaniu przeglądarki QML: 'MyQMLSignalRouter qmlSignals (& myQmlView.rootObject());' a następnie użyj 'qmlSignals' w nowym -style połączenia połączeń. Sygnały QML nie istnieją jako funkcje C++, nie mogą (są dynamiczne, C++ jest statyczne), więc uzyskanie bezpośredniego wskaźnika do nich nie jest teoretycznie możliwe, o ile rozumiem. – hyde
Mój sceptycyzm wobec tego podejścia polega na ścisłym powiązaniu między sygnałami QML i wprowadzonym przez niego C++, a także pojedynczym "superklasowym" podejściem (jedna klasa deklaruje wszystkie sygnały, wszędzie). To brzydko pachnie! Masz całkowitą rację, że sygnały QML nie są statycznie dostępne dla C++. Jednak może istnieć dynamiczne rozwiązanie: QQuickItem :: metaObject() -> indexOfSignal ("foo()") poprawnie zwraca indeks tego sygnału. AFAICT, instalator do otrzymania opakowania wymienialnego również istnieje, ale jest ukryty w przestrzeni nazw QtPrivate. Bummer. –