У меня есть файл qml с Rectangle
. Я хотел бы вызвать onClicked( )
из серверной части С++. Итак, как я могу получить доступ к ссылке на компонент QML в бэкэнде C++/Qt?
Чтобы получить доступ к компоненту QML в бэкэнде C++
Ответы (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++ или вызываемую функцию.
onSignalName
- это просто помощь для создания декларативных соединений, ее нельзя вызвать.
- person dtech; 30.03.2016