Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: yoyo от Апрель 03, 2008, 14:14



Название: Расширение API для QtScript
Отправлено: yoyo от Апрель 03, 2008, 14:14
    Имеется таблица, привязанная к движку QScripEngine. Из ячеек можно производить расчет формул, в которых участвуют другие ячейки. Сейчас обращение к ячейкам происходит в виде: "=Cell('A1').value + Cell('B3').value", а хотелось бы описывать такие формулы в сжатом виде: "=A1 + B3".
    Можно ли намекнуть парсеру (например регистрацией своего класса), что обработку A1..Z9999 я беру на себя, и не надо вызывать throwNotDefined(memberName)? Прямой путь добавления в globalObject около 300000 property мне кажется совсем не привлекательным.


Название: Re: Расширение API для QtScript
Отправлено: Sergeich от Апрель 03, 2008, 18:19
А что мешает сделать предобработку формулы перед ее передачей в QScriptEngine::evaluate?


Название: Re: Расширение API для QtScript
Отправлено: yoyo от Апрель 04, 2008, 09:22
Ничего не мешает, но очень хочется переложить на QScriptEngine всю грязную работу. Вопрос в том, можно ли в принципе раширять движок своими объектами не используя globalObject().setProperty(...).


Название: Re: Расширение API для QtScript
Отправлено: Sergeich от Апрель 04, 2008, 14:21
Есть возможность расширять движок с помощью плагинов (QScriptExtensionPlugin), но я не уверен что это решит твою проблему.


Название: Re: Расширение API для QtScript
Отправлено: Tonal от Апрель 07, 2008, 08:14
Если выражение "чистое" - т.е. его вычисление имеет побочников, и его безболезненно можно перезапустить, то можно отлавливать исключение NotDefined(memberName), добавлять memberName и перезапускать вычисление.

Во многих скриптовых движках -  том же python-е - можно определить специальную функцию, которая будет зваться, когда интерпретатор не нашёл какого-то имени.
Странно, если QtScript такого нет... :(


Название: Re: Расширение API для QtScript
Отправлено: Dodge от Апрель 08, 2008, 16:55
ммм... а может просто стоит выражение через QRegExp протаскивать, подменять "A1 + B3" на "Cell('A1').value + Cell('B3').value"?


Название: Re: Расширение API для QtScript
Отправлено: yoyo от Апрель 10, 2008, 09:28
    Любая предобработка влечет за собой усложнение отладки скриптов. Необходимо будет предусматривать обратные преобразования из "Cell('A1').value" в "A1". Корректировать позицию указателя, где произошла ошибка. При этом нужно четко различать, кто ввел преобразование, - пользователь или мой "предпарсер".
    Решение есть! Оно на поверхности! Люблю Qt все больше и больше  :)

Код:
  MyCell *cellScript = new MyCell(engine);
  QScriptValue cellScriptValue = engine->newObject(cellScript);
  engine->globalObject().setScriptClass(cellScript);

class MyCell : public QObject, public QScriptClass
{
  ...
  MyCell(QScriptEngine * engine);
  ~MyCell();

  QScriptValue property(const QScriptValue &object, const QScriptString &name, uint id);
  QScriptClass::QueryFlags queryProperty(const QScriptValue &object,
      const QScriptString &name, QueryFlags flags, uint *id);
  void setProperty(QScriptValue & object, const QScriptString & name, uint id,
      const QScriptValue & value );
};

    Теперь любые свойства глобального объекта, которые не понимает движок, будут проходить через мои обработчики!
    Всем откликнувшимся спасибо.


Название: Re: Расширение API для QtScript
Отправлено: Dodge от Апрель 11, 2008, 13:12
в таком случае следует отметить, что это работать будет начиная с Qt 4.4