Qt 5.0: предоставление методов C++ сценарию Java

Я попытался представить объект как глобальное свойство Java-скрипту, который имеет метод ниже:

Q_INVOKABLE MyObject* createMyObject();

MyObject является производным от QObject.

когда я вызываю этот метод в Java Script, он возвращает объект типа:

QVariant(MyObject*)

мне интересно, можно ли автоматически преобразовать его в QJSValue, чтобы я мог использовать его дальше в скрипте?

4 ответов


кажется, что Java-скрипт использует QVariant как непрозрачную оболочку вокруг любого "неизвестного" типа. Значение может быть передано легко, но не его свойства могут быть использованы и не его методы могут быть вызваны. Для использования в скрипте он должен быть преобразован в QJSValue. Единственный способ, который я нашел, - объявить вспомогательную функцию следующим образом:

Q_INVOKABLE QJSValue convert(QVariant var)
{
    return _engine.newQObject(var.value<QObject*>());
}

тогда можно преобразовать QVariant в QJSValue:

var obj = convert(createMyObject());

и obj будет типа

MyObject

Так что теперь он может используется в скрипте.


все, что нужно сделать, это вызвать метод ниже где-то перед ссылкой объект MyObject в скрипте.

qmlRegisterType<MyObject>("", 1, 0, "MyObject");

затем createMyObject метод вернет правильный тип без какого-либо преобразования:

var obj = createMyObject();

MyObject

на самом деле, если мы изменим тип метода ниже

Q_INVOKABLE MyObject* createMyObject();

to

Q_INVOKABLE QObject* createMyObject();

он начнет работать даже без

qmlRegisterType

можно использовать QJSEngine::newQObject() метод.

использовать newQObject() обернуть QObject (или подкласс) указатель. newQObject() возвращает объект прокси-скрипта; свойства, дочерние элементы и сигналы и слоты QObject доступны как свойства объекта прокси. Код привязки не требуется, потому что он выполняется динамически с использованием метаобъектной системы Qt.

пожалуйста прочитайте более подробную информацию на Класс QJSEngine: Интеграция QObject.


Я нахожусь в аналогичной ситуации, пытаясь использовать QJSEngine для сценариев (на данный момент застрял в попытке предоставить QList QJSEngine...)

Я думаю, что самый простой способ предоставить существующий объект C++ для сценариев таков:

//create c++ file object
MyObject* anObject = new MyObject();

//make c++ object available to script
QJSValue scriptObject = myEngine.newQObject(anObject);
myEngine.globalObject().setProperty("obj", scriptObject);

теперь вы должны иметь доступ к "obj" из скрипта.

кстати, как узнать тип в скрипте (QVariant(MyObject*))?