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*))?