На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> [Qt] QtScript и вызовы C++ методов. , Интересное поведение во время вызовов метода.
    И так, КОД:

    Файл main.cpp
    ExpandedWrap disabled
      #include <QtGui>
      #include "scriptobject.h"
       
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
       
          ScriptObject *obj = new ScriptObject();
          obj->run();
       
          return a.exec();
      }


    Файл scriptobject.cpp
    ExpandedWrap disabled
      #include "scriptobject.h"
       
      ScriptObject::ScriptObject(QObject *parent) :
          QObject(parent)
      {
          engine = new QScriptEngine(this);
          QScriptValue scriptObj = engine->newQObject(this);
          engine->globalObject().setProperty("scriptObj", scriptObj);
      }
       
      void ScriptObject::run(){
          engine->evaluate("scriptObj.exit();");
      }
       
      void ScriptObject::exit(){
          qDebug() << "exit...";
          qApp->exit();
          qDebug() << "...exit";
      }


    Файл scriptobject.h
    ExpandedWrap disabled
      #ifndef SCRIPTOBJECT_H
      #define SCRIPTOBJECT_H
       
      #include <QtScript>
      #include <QObject>
       
      class ScriptObject : public QObject
      {
          Q_OBJECT
      private:
          QScriptEngine *engine;
       
      public:
          explicit ScriptObject(QObject *parent = 0);
       
      signals:
       
      public slots:
          void run();
          Q_INVOKABLE void exit();
       
      };
       
      #endif // SCRIPTOBJECT_H


    Вывод приложения:
    exit...
    ...exit


    А теперь то, над чем парюсь уже 2-ю неделю... КАКОГО???
    Между двумя выхлопами по идее должен произойти ахтунг, а приложение просто не завершается!!!
    Пните хоть где копать...
    Сообщение отредактировано: metej -
      попробуй добавь QApplication в скрипт и вызови exit из скрипта

      QScriptValue scriptApp = engine.newQObject(&app);
      engine->globalObject().setProperty("app", scriptApp);

      Также можно попробовать дебагить SriptObject::exit(){ { ... } и посмотреть почему qApp->exit не работает
        Эээ...
        Совсем глупую весчь ща спрошу...

        ExpandedWrap disabled
          int main(int argc, char *argv[])
          {
              QApplication a(argc, argv);
              a.exit();
              return a.exec();
          }


        тоже не завершается...
        я что то не так понял? :huh:
          a.exit до a.exec ;)

          правильно делать через QTimer::singleShot(0, qApp, SLOT(exit()));
            Ваша правда...
            Но это что получается... QtScript фактически отрабатывает в пределах текущего потока еще до запуска a.exec()?
            Как же он тогда обеспечивает механизм сигнал-слот если он еще не запущен? (по докам вроде как есть плюшка которая позволяет коннектиться к сигналам)
            Если попытаться сразу же после вызова a.exec() например вызвать сигнал ScriptObject в котором и запускать engine->evaluate - то по идее тоже не взлетит, ибо тогда основной поток зациклится в a.exec() (он вроде как блокирующий)....
            Как быть то?

            p.s. вобще затея была примерно следующая... навоять оброботчик этого самого qscript для своих нужд, а по мере необходимости докидывать в его окружение qt классы и рисовать врапперы с фабриками... этакий JScript от MS но только кроссплатформенный...
              Наследуйтесь от QApplication и внутри в конструкторе делайте
              QTimer::singleShot(0, this, SLOT(StartScript())); ( или внутри processEvents это по вкусу ) и там уже работайте с вашим скриптом
                Мне почему то кажется это грязным хаком...
                Надо исходники QWidget расковырять... там как то запускается внутренний цикл отрисовки окна при этом не блокируя основной поток приложения... если удастся понять алгоритм - можно будет реализовать свой класс с проверкой состояния QApplication и получив информацию о том что оно завелось уже тогда запускать скрипт...
                Подскажите, какой хак грязнее? :)
                  ничего не понял про внутренний цикл отрисовки, его там просто нет ( в виджете его нет ) !

                  Также не понял почему расширение класса QApplication кажется хаком, ну да ладно.

                  Если внутри виджета запуск устраивает, отлично, делаем кнопку по сигналу clicked запускаем скрипт
                    Я видимо слишком торопился и был не точен в формулировках...
                    Попытаюсь высказаться четче...
                    Если взять другой фреймворк (SWT? SDL?) то отрисовка окна происходит в цикле, если цикл не запускать а только инициализировать окно и сделать видимым - оно моргнет и исчезнет. В этом же цикле вызывается функция которая позволяет обработать события поступающие от пользовательского интерфейса. Вполне логично предположить что где-то глубоко в дебрях Qt есть этот самый цикл (подозреваю что он стартует во время вызова QCoreApplication::exec()), а QWidget как наиболее очевидный представитель подобного поведения был выбран не как вариант для наследования (не хочется тащить из-за одного вечно закрытого окна библиотеку по зависимостям), а как вариант для разбора логики. Если там такого цикла нет, значит наверняка предусмотрен механизм регистрации в цикле приложения (сигнал-слот?), вот если создать самостоятельный класс унаследованый от QObject и зарегистрировать его аналогичным образом в цикле (присоединить к сигналу? реализовать слоты?) и уже при получении сигнала запускать скрипт - и волки сыты и овцы в шоколаде... :) Так у меня получится и QCoreApplication полностью инициализирован, механизм сигнал-слот доступным, и скрипт отработает фактически внутри exec()...

                    Про наследование от QApplication - да не, не это хак, это наоборот по моему очень даже интересная затея, его тогда можно будет передать в окружение скрипта а не нативный QApplication... я имел ввиду QTimer... вот это вроде хак...

                    p.s. В идеале GUI не нужен...

                    Добавлено
                    Сейчас еще раз перечитал все сообщения...
                    понял что туплю не по детсадовски...
                    processEvents - должно быть оно! Пшол курить как с ним хорошо дружить...

                    тему пока не закрываю... авось не взлетит...
                      Чтобы попасть внутрь цикла сообщений достаточно сделать вот что:

                      QTimer::singleShot(0, your-object, SLOT(StartScriptSlot()));

                      your-object - объект который наследованный от QObject
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0288 ]   [ 16 queries used ]   [ Generated: 3.10.23, 04:07 GMT ]