Чтобы получить доступ к компоненту QML в бэкэнде C++

У меня есть файл qml с Rectangle. Я хотел бы вызвать onClicked( ) из серверной части С++. Итак, как я могу получить доступ к ссылке на компонент QML в бэкэнде C++/Qt?


person Ashif    schedule 29.03.2016    source источник


Ответы (1)


Вы должны использовать QObject::findChild(), чтобы найти объект, и просто вызвать сигнал, как если бы вы использовали номинальный метод.

Но есть одна загвоздка, так как QQuickRectangle сам по себе является закрытым классом, поэтому он недоступен напрямую для использования в C++ API. Кроме того, на самом деле у него нет сигнала clicked(), если только вы не реализовали его самостоятельно. И если бы вы это сделали, это не было бы частью интерфейса C++.

Также нет сигнала onClicked(), есть сигнал clicked(), а onClicked: — это хук обработчика.

Однако вы все равно можете испускать его с помощью метасистемы Qt, просто используйте:

QObject * object = engine.rootObjects().at(0)->findChild<QObject *>("yourObjectName");
if (object) QMetaObject::invokeMethod(object, "clicked");

Он будет работать, даже если сигнал реализован на стороне QML, он будет работать даже без приведения к конкретному типу C++.

Теперь, если ваш объект не находится непосредственно в корневом дереве объектов, вы не сможете его найти, и у вас не будет другого выбора, кроме как передать ссылку на него со стороны QML в слот C++ или вызываемую функцию.

person dtech    schedule 29.03.2016
comment
Я попытался вызвать слот QML onPropertyNameChanged() из invokeMethod, но он не обрабатывается, я думаю, сигнал можно только вызывать. - person Ashif; 30.03.2016
comment
@Ashif - такого объекта нет onSignalName - это просто помощь для создания декларативных соединений, ее нельзя вызвать. - person dtech; 30.03.2016