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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Массив из Script'a  (Прочитано 3879 раз)
Raks123
Гость
« : Октябрь 02, 2011, 18:29 »

Есть такая задача: передаем строку в скрипт, а выводим из него численный массив. Я делаю так:


    QScriptEngine engine;

    QString fileName(":/script.js");
    QFile scriptFile(fileName);
    scriptFile.open(QIODevice::ReadOnly);
    QTextStream stream(&scriptFile);
    QString contents = stream.readAll();
    scriptFile.close();

- Ну тут все понятно, открываем скрипт. читаем и обозначиваем объект движка

QString stroka ("12345123");

- Вот строка. взял её так просто, нужно понять принцип, а потом усложнять

QScriptValue add = engine.globalObject().property("add");

Я завожу глобальный объект, который после будет обращаться в скрипт по имени функции

QDebug () <<add.call (QScriptValue (), QScriptValueList () <<stroka) toVariant ().

Вот я вызываю функцию и передаю строку в скрипт. Ниже простой скрипт:

function add(stroka) {
   arr = Array;

    for (i=0; typeof(stroka)!=="undefined"; i=i+1){
        arr=stroka;
    }
    return arr;
}

Дело в том, что выводит следующее:

QVariant(QVariantMap, QMap(("0", QVariant(QString, "1") ) ( "1" ,  QVariant(QString, "2") ) ( "2" ,  QVariant(QString, "3") ) ( "3" ,  QVariant(QString, "4") ) ( "4" ,  QVariant(QString, "5") ) ( "5" ,  QVariant(QString, "1") ) ( "6" ,  QVariant(QString, "2") ) ( "7" ,  QVariant(QString, "3") ) ( "isArray" ,  QVariant(QVariantMap, QMap(("length", QVariant(double, 1) ) ( "name" ,  QVariant(QString, "isArray") ) )  ) ) ( "length" ,  QVariant(double, 1) ) ( "name" ,  QVariant(QString, "Array") ) ( "prototype" ,  QVariant(QVariantList, () ) ) )  )

Я дописывал в строку toMap (). -
QDebug () <<add.call (QScriptValue (), QScriptValueList () <<stroka) toVariant () toMap ()..;
и начало выводить следующее:

QMap(("0", QVariant(QString, "1") ) ( "1" ,  QVariant(QString, "2") ) ( "2" ,  QVariant(QString, "3") ) ( "3" ,  QVariant(QString, "4") ) ( "4" ,  QVariant(QString, "5") ) ( "5" ,  QVariant(QString, "1") ) ( "6" ,  QVariant(QString, "2") ) ( "7" ,  QVariant(QString, "3") ) ( "isArray" ,  QVariant(QVariantMap, QMap(("length", QVariant(double, 1) ) ( "name" ,  QVariant(QString, "isArray") ) )  ) ) ( "length" ,  QVariant(double, 1) ) ( "name" ,  QVariant(QString, "Array") ) ( "prototype" ,  QVariant(QVariantList, () ) ) )  

Я посмотрел еще упрощение и дописал значения (). -
QDebug () <<add.call (QScriptValue (), QScriptValueList () <<stroka) toVariant () toMap () values ()...;
И выводит следующее:

(QVariant(QString, "1") ,  QVariant(QString, "2") ,  QVariant(QString, "3") ,  QVariant(QString, "4") ,  QVariant(QString, "5") ,  QVariant(QString, "1") ,  QVariant(QString, "2") ,  QVariant(QString, "3") ,  QVariant(QVariantMap, QMap(("length", QVariant(double, 1) ) ( "name" ,  QVariant(QString, "isArray") ) )  ) ,  QVariant(double, 1) ,  QVariant(QString, "Array") ,  QVariant(QVariantList, () ) )  

Вот тут я и застрял, так как дальнейшее преобразование у меня просто не получается, да и в теле функции оно будет лишнее. Нужна помощь в переписании самого скрипта и получении из него только значений в массив, а не бесполезной кучи, которую надо преобразовывать.
« Последнее редактирование: Октябрь 02, 2011, 19:18 от Raks123 » Записан
asvil
Гость
« Ответ #1 : Октябрь 02, 2011, 19:32 »

Вообщем то прочтите хотя бы кутишную документацию о том, что такое ecmascript.
Ecma script язык в котором все есть "объекты". Эти объекты отображаются в с++ объекты QScriptValue.
Все "объекты" имеют свойства. Свойства в свою очередь тоже "объекты".
Есть один большой корневой объект engine.globalObject().
QScriptValue маршалиться в QVariantMap. Все свойства объекта становятся ключами словаря. B свою очередь все значения словаря становяться из QScriptValue в QVariantMap.
QStringValue.property можно уравнять с QVariantMap.value.
Идем дальше, массив в скрипте это объект со свойствами 1,2,3...n и length, prototype, etc.
Поэтому вы получаете то, что вы получаете.
По идее есть метод у QScriptValue, который сразу умеет в QVariantList преобразовывать. Что-то типа toList(), или toArray(), лень смотреть.
Записан
Raks123
Гость
« Ответ #2 : Октябрь 03, 2011, 04:26 »

Последний вывод и есть QVariantList
Записан
Raks123
Гость
« Ответ #3 : Октябрь 03, 2011, 17:28 »

Нашел решение))) скрипт остался таким же, а основную функцию пришлось подправить:

    QScriptValue variant;

    engine.evaluate(contents);

    QScriptValue add = engine.globalObject().property("add");
 
   variant = add.call(QScriptValue(), QScriptValueList() << stroka );

   QScriptValueIterator it(variant);

   while(it.hasNext()){
       it.next();
       if (!(it.flags() && QScriptValue::SkipInEnumeration))
      {
        qDebug()<<it.name()<<": " <<it.value().toInteger();
       }
   }

Наконец то начало выводить следующее:
"0" :  1
"1" :  2
"2" :  3
"3" :  4
"4" :  5
"5" :  1
"6" :  2
"7" :  3 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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