Sygnał C++ do gniazda QML w Qt
Chcę wysłać sygnał z C++ do gniazda w moim pliku QML.
Już działa bez i prymitywnych parametrów typu, chociaż jeśli chcę wysłać QString
do mojego gniazda QML dostaję błąd podczas łączenia.
Podłączam się w main.cpp
QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj, SIGNAL(finishedGatheringDataForItem(QString)),
contentView, SLOT(updateViewWithItem(QString)));
Relawantna część mojego pliku qml
Rectangle {
objectName: "contentView"
function updateViewWithItem(string) { console.log('got some Items'); } // slot
}
Błąd:
Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
3 answers
Myślę, że najlepiej będzie, jeśli sprawdzisz ten tutorial:
Http://doc.qt.io/qt-4.8/qtbinding.html
Szczególnie ta sekcja:
Http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals
Myślę, że Twoim błędem w tym przypadku może być albo to, że nie zadeklarowałeś tego jako miejsca, albo nie sprawiłeś, że można go przywołać. Obie opcje są wyjaśnione w samouczku Qt.Ponadto, musisz użyć QVariant w celu wymiany danych między C++ i QML. Możesz także rejestrować typy, np. widżety i inne rzeczy, aby móc używać ich w QML jako" natywnego " typu, jak prostokąt. W większości przypadków nie jest to zalecane, z wyjątkiem sytuacji, gdy potrzebujesz pewnej klasy extern lub danych, których nie możesz wyświetlić w innym miejscu w interfejsie QML.
Powodem QVariant jest Skryptowe podejście QML. QVariant zasadniczo zawiera dane użytkownika i opis typu danych, dzięki czemu QML wie, jak prawidłowo je obsługiwać. Dlatego parametr w QML należy podać za pomocą String, int itd.. Ale oryginalna wymiana danych z C++ pozostaje QVariant
Używałem wcześniej qmlRegisterType, ale jest to bardzo niewygodne rozwiązanie dla prostych typów danych. Jest raczej używany do bardziej złożonych danych, takich jak niestandardowe widżety, Elementy Canvas lub wideo, które QML nie obsługuje natywnie ani nie rozszerza QStandardItemModels
. Jest to wygodniejszy sposób wymiany danych pomiędzy QML i C++ i nie wymaga sygnałów ani slotów w pierwszej wystąpienia, ponieważ QStandardItemModel automatycznie aktualizuje GUI. Aby używać modelu QStandardItemModel, musisz zarejestrować typ w qmlRegisterType.. . Model może być następnie używany w widokach opartych na modelu, takich jak ListView itp.
Załączam tutorial do tego tematu, który opisuje jak korzystać z QListModel.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 15:34:18
Należy użyć Połączenia w tym przypadku (może to jedyny sposób na połączenie).
-
Umieść swój obiekt myObj do pliku QML przez
setContextProperty
qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
-
Twój sygnał to
finishedGatheringDataForItem(QString signalString)
-
W pliku QML dodaj Polubienia Connectios poniżej:
Connections { target: YourObject onFinishedGatheringDataForItem: { qmlString = signalString } }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-12 08:49:08
Rozwiązanie bez Connections
i dowolnego kontekstu polega na podłączeniu Nie gniazda sygnału, ale sygnału-sygnału. Znaleziono tutaj .
Przykładowy kod jest następujący.
Qml:
Window{
signal qmlSend(string textOut)
signal qmlReceive(string textIn)
onQmlReceive:{
console.log(textIn)
}
}
Plik nagłówkowy klasy Background zawiera
public signals:
void cppSend(QString textOut);
public slots:
void cppReceive(QString textIn);
I main.cpp łączy je w ten sposób:
1.Z qml na cpp:
QObject::connect(qmlRootObject, SIGNAL(qmlSend(QString)),
backgroundObject, SLOT(cppReceive(QString)));
2.Z cpp do qml:
QObject::connect(backgroundObject, SIGNAL(cppSend(QString)),
qmlRootObject, SIGNAL(qmlReceive(QString)));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-01 07:51:44