Предположим, у меня есть простой плагин QML. Периодически я проверяю состояние моего объекта, и на этом этапе я хочу запросить объект QML из c ++ следующим образом:
Код плагина (c ++)
class MyItem : public QQuickItem
{
public:
MyItem(QQuickItem *parent = 0) :
QQuickItem(parent)
{}
void timerFunction(SomeObject * obj)
{
// here I need to call QML function to validate my object, may be in this way:
callJSFunction("myFunction",obj); // that's what I need
if(obj->approved) doSomething();
}
}
Файл QML:
MyItem {
id: myItem
property bool someProperty
function myFunction(obj)
{
obj.approved = someProperty;
}
}
Я не могу использовать сигналы только потому, что вызов JS должен быть синхронным. Я имею в виду, что мне нужно:
Итак, мой вопрос — есть ли способ вызвать функцию JS из объекта плагина C ++?
Я не могу использовать сигналы только потому, что вызов JS должен быть синхронным.
Сигналы в Qt по умолчанию фактически синхронны. Когда вы излучаете сигнал, все подключенные слоты вызываются сразу, а оператор emit возвращается только после выполнения всех слотов.
Так что в вашем случае сделайте MyItem
испустить сигнал и подключиться к этому сигналу в QML.
(Единственное исключение в многопоточном коде, но я предполагаю, что ваш MyItem
экземпляр живет в том же потоке, что и движок QML)
Конечно, вы можете сделать это наоборот и вызвать JS-функции из C ++. Я бы выступил против этого, поскольку это нарушает многоуровневую структуру — слой QML должен получить доступ к слою C ++, а не наоборот.
В любом случае, для вызова функций JS из C ++ используйте QMetaObject :: InvokeMethod. Для получения полной информации, посмотрите документацию о Взаимодействие с объектами QML из C ++.
Других решений пока нет …