QtScript - обмен данными с основным приложением (не получается :()

Модератор: Модераторы разделов

Аватара пользователя
whirlwind
Сообщения: 67

QtScript - обмен данными с основным приложением

Сообщение whirlwind »

Пытаюсь использовать QtScript в качестве скриптового языка в своих приложениях. Нужно, чтобы скрипт обрабатывал какие-то данные и результат возвращал в программу.

Для теста написал такой скрипт:

Код: Выделить всё

function somearrConstructor(v1, v4)
{
    this.len = v1
    this.textdata = v4
}

var somearr = new somearrConstructor( 4, "anothertext")

return ( somearr )


и вот так его отрабатываю:

Код: Выделить всё

 QScriptValue qer = qsEngine.evaluate(testScript);

    if (qsEngine.hasUncaughtException())
    {
        int line = qsEngine.uncaughtExceptionLineNumber();
        qDebug() << "    uncaught exception at line"
                 << line << ":" << qer.toString();
    }

    QScriptValue tscv = qer.property("len");
    if (tscv.isValid() )
        qDebug() << "    "<< "len is " << tscv.toInt32();


Работает нормально, но проблема в том, что мне на самом деле нужно получать не массив, а таблицу. Т.е. скрипт должен быть типа такого

Код: Выделить всё

function answerConstructor (v1, v2,v3)
{
    this.text = v1
    this.action = v2
    this.num = v3
}

function somearrConstructor(v1, v2, v3, v4)
{
    this.len = v1
    this.first = v2
    this.second = v3
    this.textdata = v4
}

var answer1 = new answerConstructor( "www111", "ee33", 456)
var answer2 = new answerConstructor( "qqq111", "eccc33", 856)

var somearr2  = new somearrConstructor( 4, answer1, answer2, "anothertext")

return ( somearr2 )


Но вот он не работает.

Код: Выделить всё

QScriptValue ans1 = tscv.property("second");

и ans1.isValid() возвращает false. При том, что остальные свойства возвращает нормально, как и раньше.

Возникают вопросы:
1. Как всетаки получить из скрипта таблицу?
2. Как получить значения переменных после выполнения скрипта. Т.е. например

Код: Выделить всё

var a = 1
var b = a + 3
return a+b

Как узнать значения отдельно a и b ?

3. Существует ли где-то руководство по QtScript? Именно руководство, а не стандарт, и именно по QtScript, а не по Java
4. Отладчик будет когданибудь потом, ладно... Но, есть ли где-то интерпретатор, как в lua, например?
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: QtScript - обмен данными с основным приложением

Сообщение Denjs »

попробую ответить "в сторону", не совсем по коду,т.к. с созданием классов на QtScript не игрался,
но подозреваю, вы просто "не в том направлении роете"

>>Как всетаки получить из скрипта таблицу?
что такое "таблица"? есть тип массив. Есть различные строковые типы и классы и т.д.
Определите лучше соответствующий С++ класс или структуру (лучше класс, имхо удобнее),
определите соответсвующие конструкторы копирования, определите функцию-конструктор, зарегистрируйте его тип в системе метаданных и т.п. (полный список вссего что нужно есть в статьях assistant) , и работайте с этим классом - т.е. передавайте объект этого класса.. А внутри этого класса - делайте что вам надо - массив, список, таблицу, дерево или что вам надо.

Могу посоветовать смотреть код проекта QDroid.
там в частности есть классы которые можете взять за шаблоны - для них решены трудности с конструктором, передачей с сигналами и т.п.
Буду рад выслушать ваши комментарии и заметки. А если сделаете пару-тройку полезных классов, которые можно будет включить в "состав стандартной поставки" - будет вообще классно.

и ещё - если вдруг вы используете QT 4.3 - переходите на QT 4.4 - там есть ряд вкусностей в отношении QT-скриптов которых нет в 4.3 (например, можно определить "глобальную" функцию которая будет доступна в скрипте )

>>Существует ли где-то руководство по QtScript?
гм... читать внимательно assistant. оно и есть руководство. начать со статьи QtScript.
Если хотите почитать основы языка - там есть ссылка на «ECMA-262». на английском естественно.

>> Но, есть ли где-то интерпретатор, как в lua, например?
гм... не понимаю... что значит интерпретатор? qsEngine - это что?
или вам нужен внешний исполняемый файл? гм.. QDroid ? (возможно это и есть то что имеете в виду под "интерпретатором"?) но не думаю что это можно назвать "интерпретатором", т.к. QtScript - предназначен для работы внутри программы, а QDroid - это попытка создать "универсальнцю многоцелевую среду" с различными классами, что бы на QtScript можно было писать "самостоятельные" программы...
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
whirlwind
Сообщения: 67

Re: QtScript - обмен данными с основным приложением

Сообщение whirlwind »

Еще раз попробую описать, чего я хочу, уже на примере вашего проекта :) Там в заголовке каждого скрипта нужно указывать кодировку, /*codepage=Windows-1251;*/ . Это неудобно, нужен лишний, достаточно громоздкий код для парсинга строки с настройками. Вместо этого можно добавить в скрипт такой код (написано просто так, могут быть неожиданнности):

Код: Выделить всё

var engineSettings = new Array()

engineSettings["codepage"]="Windows-1251";

if (initializationLaunch)
{
    return engineSettings;
}


И, соотсетственно, при загрузке делать инициализационный запуск. Чтобы скрипт понял, что происходит именно инициализация, а не реальная работа, передаем ему переменную initializationLaunch

Код: Выделить всё

QScriptValue initLaunch = qsEngine.newVariant(true);
qsEngine.globalObject().setProperty("initializationLaunch", initLaunch);

QScriptValue qer = qsEngine.evaluate( someScript );

CurrentScriptCodePage = qer.property("codepage").toString();


В приципе, кода тоже получилось довольно много (я еще и проверки пропустил, типа IsValid и т.д.), но при нескольких опциях такой путь, наверное, окажется проще.
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: QtScript - обмен данными с основным приложением

Сообщение Denjs »

не совсем понимаю идею с инициирующим запуском.
кодировка - это свойство файла, а не скрипта.
Нам необходимо знание о кодировке до того, как будет загружен файл скрипта - что бы при именно при загрузке файла преобразовывать символы локальной кодировки во внутренний UTF - иначе все русские и др. буквы попадут в qsEngine в виде "не понятной белиберды" и скрипт уже ничего не сможет с ними сделать.

О громоздкости кода - да возможно код парсинга строки с кодировкой и кажется большим, но "дальше больше" - будет ещё и "препроцессор" для обработки инструкций в стиле сишных #include и поддержания "совместимости" с представлениями об исполняемом сценарии в линукс.
Первой строкой теперь идет ссылка на исполняемый файл для запуска qdroid-скриптов как самостоятельных сценариев под Linux -

Код: Выделить всё

#/usr/bin/qdroid
. Далее будет реализована поддержка

Код: Выделить всё

#include filename;
.
А строка указания кодировки для поддержания единообразия "нескриптовых" инструкций "превращается" в

Код: Выделить всё

#codepage=Windows-1251;

В общем от "громоздкого кода" никуда пока деться. имхо.

О том как передавать настройки - я полагаю создавать глобальный объект массив в котором по номерам или именам (ещё не определил как лучше) будут доступны параметры передаваемые скрипту. Скрипт при необходимости обращается в данный массив.

гм... опять я кажется в сторону ответил, но я похоже не совсем понимаю, о чем вы...
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали: