crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Context Evaluate, Как Выполнить модули в едином контексте ?
JohnZ
  опции профиля:
сообщение 19.5.2017, 13:05
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

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




Репутация:   0  


В доке написано
Цитата
QScriptValue QScriptEngine::evaluate ( const QString & program, const QString & fileName = QString(), int lineNumber = 1 )
Evaluates program, using lineNumber as the base line number, and returns the result of the evaluation.
The script code will be evaluated in the current context.

Но в действительности получается что каждый evaluate создаёт свой контекст и ...
evaluate ("var x = 2");
evaluate ("var y = 3");
evaluate ("var z = x + y");

z не вычисляется, т.к. в его контексте нет x & y ?!
Это при условии что вызов evaluate происходит из _разных_ объектов, но по единому указателю QScriptEngine .

Вопрос - возможно-ли сохранить единый контекст для ВСЕХ evaluate ?
(до пере-инициализации QScriptEngine, ес-сно)

Заранее благодарен за помощь !
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.5.2017, 10:56
Сообщение #2


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

Группа: Участник
Сообщений: 2886
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


я так понимаю, evaluate выполняет отдельный снипет. С аргументами, как показывает справка, можно вызвать функцию так

http://doc.qt.io/qt-5/qscriptengine.html
QScriptValue fun = myEngine.evaluate("(function(a, b) { return a + b; })");
QScriptValueList args;
args << 1 << 2;
QScriptValue threeAgain = fun.call(QScriptValue(), args);


можно также задать глобальные переменные переменные
void QScriptEngine::setGlobalObject(const QScriptValue &object)


сам не тестил, только предполагаю )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 10.6.2017, 10:37
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

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




Репутация:   0  


Вот кусок примера из QT, из тетриса ...
Раскрывающийся текст

int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(tetrix);

//! [1]
QApplication app(argc, argv);
QScriptEngine engine;

QScriptValue Qt = engine.newQMetaObject(QtMetaObject::get());
Qt.setProperty("App", engine.newQObject(&app));
engine.globalObject().setProperty("Qt", Qt);
//! [1]

#if !defined(QT_NO_SCRIPTTOOLS)
QScriptEngineDebugger debugger;
debugger.attachTo(&engine);
QMainWindow *debugWindow = debugger.standardWindow();
debugWindow->resize(1024, 640);
#endif

//! [2]
evaluateFile(engine, ":/tetrixpiece.js");
evaluateFile(engine, ":/tetrixboard.js");
evaluateFile(engine, ":/tetrixwindow.js");
//! [2]

//! [3]
TetrixUiLoader loader;
QFile uiFile(":/tetrixwindow.ui");
uiFile.open(QIODevice::ReadOnly);
QWidget *ui = loader.load(&uiFile);
uiFile.close();

QScriptValue ctor = engine.evaluate("TetrixWindow"); // <---------- ???

QScriptValue scriptUi = engine.newQObject(ui, QScriptEngine::ScriptOwnership);
QScriptValue tetrix = ctor.construct(QScriptValueList() << scriptUi);
//! [3]
........


Во второй секции 3 послед-х вызова evaluate. Ведь раблтает в едином контексте !

У меня "попутный" вопрос, что делает отмеченная строка в 3-й секции ?
Ведь
evaluateFile(engine, ":/tetrixwindow.js");
уже вызывалась во 2-й секции.

Что-бы это значило ??? QScriptValue ctor = engine.evaluate("TetrixWindow"); // <---------- ???

Что она вычисляет ? подскажите плз ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.6.2017, 15:55
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


судя по имени переменной "ctor", она является ссылкой на конструктор.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 14.6.2017, 12:32
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

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




Репутация:   0  


Дык ясень-красень что evaluate возвращает QScriptValue, согласно докам, вопрос в другом,
откуда взят параметр вызова "TetrixWindow" и что обозначает ?

Что engine компилит ?

Ведь это-же НЕ скрипт !!! Тогда ЧТО ?

В проекте есть XML-ная UI форма с таким именем ! Не может-же engine компилить её ?! :blink:
Но судя по строке вызова, получается именно так :blink:

Сообщение отредактировал JohnZ - 14.6.2017, 12:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.10.2019, 21:56