Russian Qt Forum
Ноябрь 22, 2024, 06:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QScriptEngine::evaluate(). Эквивалент __LINE__ в контексте скрипта  (Прочитано 5717 раз)
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« : Октябрь 18, 2012, 10:00 »

Существуют ли аналоги  макросов __LINE__   __FUNC__  доступные в контексте скрипта?


[РЕШЕНО]  решение здесь
« Последнее редактирование: Январь 22, 2013, 21:46 от lesav » Записан

lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #1 : Октябрь 18, 2012, 13:03 »

Странно, никому не нужно было отлавливать эксепшены в скриптах ?

Может и мне оно не надо ?
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 18, 2012, 13:27 »

Странно, никому не нужно было отлавливать эксепшены в скриптах ?

Может и мне оно не надо ?
Это может интересно, но непонятно - о каком "скрипте" идет речь? Я знаю что __LINE__ печатает текущую строку, но мне это никогда не было нужно. Также хз что за эксепшн и чего это он в скрипте Непонимающий. В общем, адаптируйте пост "для широкого круга", а то сейчас как с MSDN - неясно это С++ или Васька или что-то еще  Улыбающийся
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #3 : Октябрь 18, 2012, 18:50 »

Стандартный подход:
  создать QScriptEngine
  отобразить некие объекты в скрипт (они доступны в теле скрипта)
  выполнить

Код
C++ (Qt)
QScriptEngine scriptEngine;
QFile file("./js_script.js");
if(file.open(QIODevice::ReadOnly)) {
  QScriptValue val = scriptEngine.newQObject(qtMyObject);
  scriptEngine.globalObject().setProperty("jsMyObject", val);
 
  QString strScript = file.readAll();
 
  QString strRes = scriptEngine.evaluate(strScript).toString();
  if(scriptEngine.hasUncaughtException()) {
     qDebug() << "Exception: file " << file.fileName()
              << " Line " << scriptEngine.uncaughtExceptionLineNumber()
              << " result " strRes;
  }
}

В скрипте происходит следующее:
Код
Java
var __LINE__ = 3;
function test(){
 jsMyObject.appendLog("Ok", __LINE__);
}
test();


Из js выполняется метод Q_INVOKABLE  void qtMyObject::appendLog(Qstring, int)


Вот я и спрашиваю, существует ли "Эквивалент Си-шного макроса __LINE__  в контексте скрипта"?
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 19, 2012, 07:14 »

Ну вот, теперь ясно. Правда поддержать разговор я не могу (с этими скриптами никогда не работал), ну ничего, с интересом послушаю
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #5 : Декабрь 31, 2012, 12:22 »

__LINE__ эквивалента в  JS нет.
Но исполнитель скрипта всегда знает какую он сейчас выполняет функцию скрипта и на каком номере строки он сейчас находиться.

При вызове функции логирования в JS вызывается Q_INVOKABLE функция в C++, в которой уже можно посмотреть в какой функции и номере строки сейчас был вызов.


Код:
QScriptEngine *m_pScriptEngine;
......
void myClass::appendLog(const QString &msg)
{
    // Посмотреть где произошел вызов  appendLog
    QStringList debugJs = m_pScriptEngine->currentContext()->backtrace();
    // Взятьфункцию и номер строки
    ........
    addLog(fnc, line, msg);
}
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.106 секунд. Запросов: 22.