Russian Qt Forum
Ноябрь 22, 2024, 12:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Расширение API для QtScript  (Прочитано 9114 раз)
yoyo
Гость
« : Апрель 03, 2008, 14:14 »

    Имеется таблица, привязанная к движку QScripEngine. Из ячеек можно производить расчет формул, в которых участвуют другие ячейки. Сейчас обращение к ячейкам происходит в виде: "=Cell('A1').value + Cell('B3').value", а хотелось бы описывать такие формулы в сжатом виде: "=A1 + B3".
    Можно ли намекнуть парсеру (например регистрацией своего класса), что обработку A1..Z9999 я беру на себя, и не надо вызывать throwNotDefined(memberName)? Прямой путь добавления в globalObject около 300000 property мне кажется совсем не привлекательным.
Записан
Sergeich
Гость
« Ответ #1 : Апрель 03, 2008, 18:19 »

А что мешает сделать предобработку формулы перед ее передачей в QScriptEngine::evaluate?
Записан
yoyo
Гость
« Ответ #2 : Апрель 04, 2008, 09:22 »

Ничего не мешает, но очень хочется переложить на QScriptEngine всю грязную работу. Вопрос в том, можно ли в принципе раширять движок своими объектами не используя globalObject().setProperty(...).
Записан
Sergeich
Гость
« Ответ #3 : Апрель 04, 2008, 14:21 »

Есть возможность расширять движок с помощью плагинов (QScriptExtensionPlugin), но я не уверен что это решит твою проблему.
Записан
Tonal
Гость
« Ответ #4 : Апрель 07, 2008, 08:14 »

Если выражение "чистое" - т.е. его вычисление имеет побочников, и его безболезненно можно перезапустить, то можно отлавливать исключение NotDefined(memberName), добавлять memberName и перезапускать вычисление.

Во многих скриптовых движках -  том же python-е - можно определить специальную функцию, которая будет зваться, когда интерпретатор не нашёл какого-то имени.
Странно, если QtScript такого нет... Грустный
« Последнее редактирование: Апрель 07, 2008, 08:19 от Tonal » Записан
Dodge
Гость
« Ответ #5 : Апрель 08, 2008, 16:55 »

ммм... а может просто стоит выражение через QRegExp протаскивать, подменять "A1 + B3" на "Cell('A1').value + Cell('B3').value"?
Записан
yoyo
Гость
« Ответ #6 : Апрель 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 );
};

    Теперь любые свойства глобального объекта, которые не понимает движок, будут проходить через мои обработчики!
    Всем откликнувшимся спасибо.
Записан
Dodge
Гость
« Ответ #7 : Апрель 11, 2008, 13:12 »

в таком случае следует отметить, что это работать будет начиная с Qt 4.4
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 20.