Вызов функции JS в QML из плагина c ++

Предположим, у меня есть простой плагин 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 должен быть синхронным. Я имею в виду, что мне нужно:

  • в С ++ код таймера вызывает функцию timerFunction () с объектом для проверки
  • внутри timerFunction () я вызываю функцию JS и получаю результат обратно
  • После этого продолжаю выполнять timerFunction ()

Итак, мой вопрос — есть ли способ вызвать функцию JS из объекта плагина C ++?

0

Решение

Я не могу использовать сигналы только потому, что вызов JS должен быть синхронным.

Сигналы в Qt по умолчанию фактически синхронны. Когда вы излучаете сигнал, все подключенные слоты вызываются сразу, а оператор emit возвращается только после выполнения всех слотов.
Так что в вашем случае сделайте MyItem испустить сигнал и подключиться к этому сигналу в QML.
(Единственное исключение в многопоточном коде, но я предполагаю, что ваш MyItem экземпляр живет в том же потоке, что и движок QML)

Конечно, вы можете сделать это наоборот и вызвать JS-функции из C ++. Я бы выступил против этого, поскольку это нарушает многоуровневую структуру — слой QML должен получить доступ к слою C ++, а не наоборот.
В любом случае, для вызова функций JS из C ++ используйте QMetaObject :: InvokeMethod. Для получения полной информации, посмотрите документацию о Взаимодействие с объектами QML из C ++.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]