Написал небольшой тестовый пример с использованием qscript.
#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();
}
QT += script
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
contains(QT_CONFIG, scripttools): QT += scripttools
# Input
SOURCES += 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 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();
}
Странно что в документации они это не везде поправили. В описании http://doc.crossplatform.ru/qt/4.6.x/qscriptengine.html написано
#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();
}
scriptEngine.evaluate(sScript);
QScriptValue svFun = global.property( "func" );
scriptEngine.evaluate("function(){ }"); // так будет ошибка парсинга
scriptEngine.evaluate("( function(){ } )"); // так будет OK
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)