
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.197.111.121] |
![]() |
|
Сообщ.
#1
,
|
|
|
И так, КОД:
Файл main.cpp ![]() ![]() #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 ![]() ![]() #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 ![]() ![]() #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-ю неделю... КАКОГО??? Между двумя выхлопами по идее должен произойти ахтунг, а приложение просто не завершается!!! Пните хоть где копать... |
Сообщ.
#2
,
|
|
|
попробуй добавь QApplication в скрипт и вызови exit из скрипта
QScriptValue scriptApp = engine.newQObject(&app); engine->globalObject().setProperty("app", scriptApp); Также можно попробовать дебагить SriptObject::exit(){ { ... } и посмотреть почему qApp->exit не работает |
Сообщ.
#3
,
|
|
|
Эээ...
Совсем глупую весчь ща спрошу... ![]() ![]() int main(int argc, char *argv[]) { QApplication a(argc, argv); a.exit(); return a.exec(); } тоже не завершается... я что то не так понял? ![]() |
Сообщ.
#4
,
|
|
|
a.exit до a.exec
![]() правильно делать через QTimer::singleShot(0, qApp, SLOT(exit())); |
Сообщ.
#5
,
|
|
|
Ваша правда...
Но это что получается... QtScript фактически отрабатывает в пределах текущего потока еще до запуска a.exec()? Как же он тогда обеспечивает механизм сигнал-слот если он еще не запущен? (по докам вроде как есть плюшка которая позволяет коннектиться к сигналам) Если попытаться сразу же после вызова a.exec() например вызвать сигнал ScriptObject в котором и запускать engine->evaluate - то по идее тоже не взлетит, ибо тогда основной поток зациклится в a.exec() (он вроде как блокирующий).... Как быть то? p.s. вобще затея была примерно следующая... навоять оброботчик этого самого qscript для своих нужд, а по мере необходимости докидывать в его окружение qt классы и рисовать врапперы с фабриками... этакий JScript от MS но только кроссплатформенный... |
Сообщ.
#6
,
|
|
|
Наследуйтесь от QApplication и внутри в конструкторе делайте
QTimer::singleShot(0, this, SLOT(StartScript())); ( или внутри processEvents это по вкусу ) и там уже работайте с вашим скриптом |
Сообщ.
#7
,
|
|
|
Мне почему то кажется это грязным хаком...
Надо исходники QWidget расковырять... там как то запускается внутренний цикл отрисовки окна при этом не блокируя основной поток приложения... если удастся понять алгоритм - можно будет реализовать свой класс с проверкой состояния QApplication и получив информацию о том что оно завелось уже тогда запускать скрипт... Подскажите, какой хак грязнее? ![]() |
Сообщ.
#8
,
|
|
|
ничего не понял про внутренний цикл отрисовки, его там просто нет ( в виджете его нет ) !
Также не понял почему расширение класса QApplication кажется хаком, ну да ладно. Если внутри виджета запуск устраивает, отлично, делаем кнопку по сигналу clicked запускаем скрипт |
Сообщ.
#9
,
|
|
|
Я видимо слишком торопился и был не точен в формулировках...
Попытаюсь высказаться четче... Если взять другой фреймворк (SWT? SDL?) то отрисовка окна происходит в цикле, если цикл не запускать а только инициализировать окно и сделать видимым - оно моргнет и исчезнет. В этом же цикле вызывается функция которая позволяет обработать события поступающие от пользовательского интерфейса. Вполне логично предположить что где-то глубоко в дебрях Qt есть этот самый цикл (подозреваю что он стартует во время вызова QCoreApplication::exec()), а QWidget как наиболее очевидный представитель подобного поведения был выбран не как вариант для наследования (не хочется тащить из-за одного вечно закрытого окна библиотеку по зависимостям), а как вариант для разбора логики. Если там такого цикла нет, значит наверняка предусмотрен механизм регистрации в цикле приложения (сигнал-слот?), вот если создать самостоятельный класс унаследованый от QObject и зарегистрировать его аналогичным образом в цикле (присоединить к сигналу? реализовать слоты?) и уже при получении сигнала запускать скрипт - и волки сыты и овцы в шоколаде... ![]() Про наследование от QApplication - да не, не это хак, это наоборот по моему очень даже интересная затея, его тогда можно будет передать в окружение скрипта а не нативный QApplication... я имел ввиду QTimer... вот это вроде хак... p.s. В идеале GUI не нужен... Добавлено Сейчас еще раз перечитал все сообщения... понял что туплю не по детсадовски... processEvents - должно быть оно! Пшол курить как с ним хорошо дружить... тему пока не закрываю... авось не взлетит... |
Сообщ.
#10
,
|
|
|
Чтобы попасть внутрь цикла сообщений достаточно сделать вот что:
QTimer::singleShot(0, your-object, SLOT(StartScriptSlot())); your-object - объект который наследованный от QObject |