9 окт. 2008 г.

Qt4: QtScript: retreive object values from script object

Qt4.3 предоставляет возможность использовать qt скрипты.

Матчасть: QtScript Module, Qt Script: Language Reference

Quick start поможет статья On the Fast Track to Application Scripting на crossplatform.ru.

Рассмотрим пример получения значений скрипт объекта.

Объект создан примерно следующим образом:
QScriptEngine engine;
QScriptValue scriptValue = engine.evaluate("Object({name:'myName', visible:true, size:100})");

Чтобы получить все свойства объекта необходимо выполнить что-то типа javascript
for(var name in scriptValue){
var value = scriptValue[name];
}
этот код на C++/QT будет выглядеть как:
if (scriptValue.isObject()){
QScriptValueIterator it(scriptValue);
while (it.hasNext()) {
it.next();
QString name = it.name();
QVariant value = scriptValue.property(name).toVariant();
}

Для того, чтобы проставить эти значения некоторому QObject'у, необходимо:
  • класс следовал Qt's Property System - были продекларированы соответствующие Q_PROPERTY
class SomeInfo : public QObject{
Q_OBJECT
Q_PROPERTY(bool visible READ isVisible WRITE setVisible)
Q_PROPERTY(QString name READ getName WRITE setName)
Q_PROPERTY(int size READ getSize WRITE setSize)

public:
const bool &isVisible() const;
void setVisible(const bool visible);

const QString &getName() const;
void setName(const QString name);

int getSize() const;
void setSize(const int size);
};

В таком случае для SomeInfo вызывать метод QObject'а setProperty:
SomeInfo *info; 
// ...
if (scriptValue.isObject()){
QScriptValueIterator it(scriptValue);
while (it.hasNext()) {
it.next();
QString name = it.name();
QVariant value = scriptValue.property(name).toVariant();
info->setProperty(name.toUtf8().data(), value);
}

Преобразование из QVariant в требуемый тип (для данного примера: size типа int, visible типа bool и т.п) будет произведено автоматически.

Установление свойства объекта, которое у него отсутствует (например, свойство qqq для класса SomeInfo) - не вызовет ошибки.

Комментариев нет: