Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: Sasha от Декабрь 10, 2013, 12:35



Название: Вызов GUI-функций из сценария, выполняющегося в отдельном потоке
Отправлено: Sasha от Декабрь 10, 2013, 12:35
Здравствуйте,

Скрипт выполняется в отдельном потоке, но он должен вызывать функции виджетов, но возникли проблеммы. В частности я попытался изменить иконку на кнопке и получил окошко с информацией типа того, что невозможно послать сигнал объекту, созданному в другом потоке.
Как в этом случае поступать?
Пока я сделал вместо 1-й ф-ии 3: сигнал и 2 слота (private и public) примерно с одинаковыми аргументами. Сигнал соединён с private-слотом при помощи QueuedConnection, а public-слот делает emit сигнала. Но это же кошмар, если каждую ф-ю так размножать.
Может быть есть аналог QueuedConnection для скриптов? В документации я не увидел таких параметров даже для скриптовой ф-ии connect, не говоря уже о вызове функций-слотов из скриптов.


Название: Re: Вызов GUI-функций из сценария, выполняющегося в отдельном потоке
Отправлено: Bepec от Декабрь 10, 2013, 16:52
Сигнал послать можно, изменять UI напрямую нельзя. Это основы Qt.

По поводу скриптов ничего не скажу.



Название: Re: Вызов GUI-функций из сценария, выполняющегося в отдельном потоке
Отправлено: Susenin от Декабрь 28, 2013, 01:49
Можно вызвать слот из другого потока через очередь сообщений с помощью QMetaObject::invokeMethod(...) http://qt-project.org/doc/qt-4.8/qmetaobject.html#invokeMethod (http://qt-project.org/doc/qt-4.8/qmetaobject.html#invokeMethod)


Название: Re: Вызов GUI-функций из сценария, выполняющегося в отдельном потоке
Отправлено: Sasha от Январь 28, 2014, 20:57
Можно вызвать слот из другого потока через очередь сообщений с помощью QMetaObject::invokeMethod(...) http://qt-project.org/doc/qt-4.8/qmetaobject.html#invokeMethod (http://qt-project.org/doc/qt-4.8/qmetaobject.html#invokeMethod)
Спасибо, пока использую этот метод. Только всё-равно приходится огород городить и как минимум добавлять одну дополнительную проксифункцию на каждую необходимую функцию-слот, которая будет преобразовывать параметры переданные скриптом в параметры этой функции-слота.