crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Parse error. Не выполняется скрипт в qt4.6.0
igor_bogomolov
  опции профиля:
сообщение 10.2.2010, 13:52
Сообщение #1


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Написал небольшой тестовый пример с использованием 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 килобайт ) Кол-во скачиваний: 156
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.2.2010, 14:17
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Да, похоже теперь только так:
Раскрывающийся текст
#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();
}


Сообщение отредактировал BRE - 10.2.2010, 14:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 10.2.2010, 15:12
Сообщение #3


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Странно что в документации они это не везде поправили. В описании QScriptEngine написано
Цитата
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
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 14.3.2010
Пользователь №: 1530

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


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

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

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 22:53