• ? Qt juick_ppl У меня возникла проблема: мне надо отослать в скрипт строку из чисел, а скрипт должен возвращать численный массив и нужно, чтобы вся обработка (на сколько это впринципи возможно) реализовывалась в скрипте

Replies (9)

  • @Raks, скрипт на чем? ну и какие проблемы вообще могут быть — строку разобрал@вернул
  • @nib952051, Я делаю так:

    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 ()...;
    И выводит следующее:


    Вот тут я и застрял, так как дальнейшее преобразование у меня просто не получается, да и в теле функции оно будет лишнее. Нужна помощь в переписании самого скрипта и получении из него только значений в массив, а не бесполезной кучи, которую надо преобразовывать.
  • @Raks, может я плохо въезжаю, но тяжело понять зачем код/что он должен в итоге делать; но почему не add.call(stroka).toMap() ? тело js функции это пока просто тест?
  • @nib952051, Пока что просто тест
  • @Raks, не add.call(stroka).toMap() потому что приходит все равно не то что надо))
  • @Raks, ну вообще функцию я бы сначала попробовал такую function add(stroka) {
    return stroka;
    }

    и соответственно toMap() заменил на toInt() для возвращаемого значения..
  • @nib952051, ошибка: no match for 'operator<<' in 'qDebug()() << QScriptValue::toVariant() const().QVariant::toInt'
  • @Raks, ну синтаксис надо исправить)
  • @nib952051, Нашел решение))) скрипт остался таким же, а основную функцию пришлось подправить:

    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