Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Script. Интеграция WebKit _ Parse error. Не выполняется скрипт в qt4.6.0

Автор: igor_bogomolov 10.2.2010, 13:52

Написал небольшой тестовый пример с использованием qscript.

main.cpp
#include <QtCore>
#include <QtGui>
#include <QtScript>

class Test : public QObject
{
    Q_OBJECT
public slots:
    void test()
    {
#ifdef ERROR
    qDebug() << "test1";
    QString sFunction = QString("a+b");
    QString sScript = QString("function(a,b){return %1;}").arg(sFunction);
#else
    qDebug() << "test2";
    QString sScript = QString("function(a,b) { return a+b; }");
#endif
    QScriptEngine scriptEngine;
    QScriptValue svFun = scriptEngine.evaluate(sScript);
    if (scriptEngine.hasUncaughtException()) {
        qDebug() << QString("Script error: %1").arg(sScript);
        qDebug() << svFun.toString();
    } else {
        qDebug() << QString("Script Ok!: %1").arg(sScript);
    }
    QScriptValueList args;
    args << 1 << 2;
    QScriptValue res = svFun.call(QScriptValue(), args);
    qDebug() << res.toInt32();
    }
};

#include "main.moc"

int main (int argc, char ** argv)
{
    QApplication app(argc, argv);

    QPushButton * button = new QPushButton("evaluate");
    Test * test = new Test();
    QObject::connect(button, SIGNAL(clicked()), test, SLOT(test()));

    button->resize(100, 30);
    button->show();

    return app.exec();
}
test.pro
QT += script
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

contains(QT_CONFIG, scripttools): QT += scripttools

# Input
SOURCES += main.cpp

C версией qt4.5.3 этот пример прекрасно работает. С версией 4.6.0 (sdk) при выполнении получаю сообщение
Цитата
"Script error: function( a, b ) { return a+b; }"
"SyntaxError: Parse error"
Помогите разобраться в чем может быть проблема? У кого есть возможность попробуйте скомпилить под разными версиями qt.

 test.tar ( 10 килобайт ) : 147
 

Автор: BRE 10.2.2010, 14:17

Да, похоже теперь только так:

Раскрывающийся текст
#include <QtCore>
#include <QtGui>
#include <QtScript>

class Test : public QObject
{
    Q_OBJECT
public slots:
    void test()
    {
#ifdef ERROR
    qDebug() << "test1";
    QString sFunction = QString("a+b");
    QString sScript = QString("function(a,b){return %1;}").arg(sFunction);
#else
    qDebug() << "test2";
    QString sScript = QString("function func(a,b) { return a+b; }");
#endif
    QScriptEngine scriptEngine;
    scriptEngine.evaluate(sScript);
    if (scriptEngine.hasUncaughtException()) {
        qDebug() << QString("Script error: %1").arg(sScript);
    } else {
        qDebug() << QString("Script Ok!: %1").arg(sScript);
    }
    
        QScriptValue global = scriptEngine.globalObject();
        QScriptValue svFun = global.property( "func" );
      
    QScriptValueList args;
    args << 1 << 2;
    QScriptValue res = svFun.call(QScriptValue(), args);
    qDebug() << res.toInt32();
    }
};

#include "main.moc"

int main (int argc, char ** argv)
{
    QApplication app(argc, argv);

    QPushButton * button = new QPushButton("evaluate");
    Test * test = new Test();
    QObject::connect(button, SIGNAL(clicked()), test, SLOT(test()));

    button->resize(100, 30);
    button->show();

    return app.exec();
}

Автор: igor_bogomolov 10.2.2010, 15:12

Странно что в документации они это не везде поправили. В описании http://doc.crossplatform.ru/qt/4.6.x/qscriptengine.html написано

Цитата
The following code snippet shows how a script function can be defined and then invoked from C++ using QScriptValue::call():

QScriptValue fun = myEngine.evaluate("function(a, b ) { return a + b; }");
QScriptValueList args;
args << 1 << 2;
QScriptValue threeAgain = fun.call(QScriptValue(), args);
Считаю это ошибкой в документации.

Автор: Haccel 14.3.2010, 6:21

Цитата(BRE @ 10.2.2010, 14:17) *
Да, похоже теперь только так:
Раскрывающийся текст
#include <QtCore>
#include <QtGui>
#include <QtScript>

class Test : public QObject
{
    Q_OBJECT
public slots:
    void test()
    {
#ifdef ERROR
    qDebug() << "test1";
    QString sFunction = QString("a+b");
    QString sScript = QString("function(a,b){return %1;}").arg(sFunction);
#else
    qDebug() << "test2";
    QString sScript = QString("function func(a,b) { return a+b; }");
#endif
    QScriptEngine scriptEngine;
    scriptEngine.evaluate(sScript);
    if (scriptEngine.hasUncaughtException()) {
        qDebug() << QString("Script error: %1").arg(sScript);
    } else {
        qDebug() << QString("Script Ok!: %1").arg(sScript);
    }
    
        QScriptValue global = scriptEngine.globalObject();
        QScriptValue svFun = global.property( "func" );
      
    QScriptValueList args;
    args << 1 << 2;
    QScriptValue res = svFun.call(QScriptValue(), args);
    qDebug() << res.toInt32();
    }
};

#include "main.moc"

int main (int argc, char ** argv)
{
    QApplication app(argc, argv);

    QPushButton * button = new QPushButton("evaluate");
    Test * test = new Test();
    QObject::connect(button, SIGNAL(clicked()), test, SLOT(test()));

    button->resize(100, 30);
    button->show();

    return app.exec();
}


Очень не рекомендую так запускать скрипт. Можете получить ошибку, которую будете день искать и не найдёте.. есть опыт, работаю уже не первый год с qtscript.
В двух словах, после строки:

    scriptEngine.evaluate(sScript);


Когда вы запросите свойство у глобального скопа

        QScriptValue svFun = global.property( "func" );


Правое выражение вернёт инвалидный объект, или того хуже (как было у меня), если вы таким образом запускаете скрипт несколько раз, результат ранней компиляции функции . Те получается так что между этими двумя строками скрипт не успевает скомпилить или выполнить функцию. Почему так происходит - немогу знать, вроде обещано ,что всё работать синхронно должно...

Куда проще выйти из ситуации просто обернув анонимную функцию в круглые скобки.Те :


    scriptEngine.evaluate("function(){ }"); // так будет ошибка парсинга
    scriptEngine.evaluate("( function(){ } )"); // так будет OK

Автор: BRE 14.3.2010, 11:06

Цитата(Haccel @ 14.3.2010, 6:21) *
Те получается так что между этими двумя строками скрипт не успевает скомпилить или выполнить функцию. Почему так происходит - немогу знать, вроде обещано ,что всё работать синхронно должно...

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

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)