crossplatform.ru

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


  Ответ в Context Evaluate
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
JohnZ Дата 14.6.2017, 12:32
  Дык ясень-красень что evaluate возвращает QScriptValue, согласно докам, вопрос в другом,
откуда взят параметр вызова "TetrixWindow" и что обозначает ?

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

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

В проекте есть XML-ная UI форма с таким именем ! Не может-же engine компилить её ?! :blink:
Но судя по строке вызова, получается именно так :blink:
Litkevich Yuriy Дата 13.6.2017, 15:55
  судя по имени переменной "ctor", она является ссылкой на конструктор.
JohnZ Дата 10.6.2017, 10:37
  Вот кусок примера из 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"); // <---------- ???

Что она вычисляет ? подскажите плз ...
Алексей1153 Дата 20.5.2017, 10:56
  я так понимаю, 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 Дата 19.5.2017, 13:05
  В доке написано
Цитата
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, ес-сно)

Заранее благодарен за помощь !
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 20.4.2024, 0:26