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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Слот/сигнал без явного источника  (Прочитано 7822 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Декабрь 08, 2014, 12:12 »

Добрый день

Не раз возникает ситуация когда механизм слот/сигнал удобен, но нет явного "источника". Напр я хочу что-то обновить в окне, но сделать это из сугубо расчетной ф-ции которая к QObject не имеет отношения. Как Вы это решаете?

Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Декабрь 08, 2014, 12:15 »

Позвать метод слот напрямую или использовать QMetaObject::invokeMethod
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Декабрь 08, 2014, 12:43 »

Позвать метод слот напрямую или использовать QMetaObject::invokeMethod
Еще есть способ через QTimer::singleShot, если задержку надо сделать. Но лучше QMetaObject::invokeMethod (если нужно через ивент систему) или прямой вызов.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 08, 2014, 12:49 »

Напрямую все прелести теряются - надо искать получателя, проверять существует ли он и.т.д. InvokeMethod лучше но также "вываливает все кишки наружу" - не хотелось бы
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Декабрь 08, 2014, 12:54 »

Тогда через коллбэки. Тем более, в 11 стандарте лямбды появились, что упрощает жизнь.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #5 : Декабрь 08, 2014, 13:03 »

Создать пару методов, которые в зависимости от аргументов посылают нужный сигнал/ы.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Декабрь 08, 2014, 13:20 »

Я создаю в производном от QApplication нужные мне методы и вызываю их через QMetaObject::invokeMethod( QCoreApplication::instance(), ... ).
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 08, 2014, 18:04 »

Ну а почему не банальный синглтон (унаследованный от QObject)? По крайней мере так расчеты могут ничего не знать о наличии Qt. Или это я "перемудрил"?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Декабрь 08, 2014, 18:08 »

Ну а почему не банальный синглтон (унаследованный от QObject)?
Дык QApplication как раз оный и есть )
Записан

Qt 5.11/4.8.7 (X11/Win)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Декабрь 08, 2014, 18:14 »

Ну а почему не банальный синглтон (унаследованный от QObject)? По крайней мере так расчеты могут ничего не знать о наличии Qt. Или это я "перемудрил"?
Мне кажется да.
Почему нельзя расчетные функции положить в класс наследник QObject и использовать штатную систему?
Все равно функции придется модифицировать для сигналинья.
Записан
_OLEGator_
Гость
« Ответ #10 : Декабрь 08, 2014, 18:23 »

Может наведет на нужные мысли:
http://www.prog.org.ru/topic_24458_0.html

Там есть класс CXEventMachine, с помощью которого можно подписаться на произвольное событие (используется механизм сигналов/слотов). Событие испускается также с помощью этого класса и раздается всем подписанным.

Подписывание на событие:
Код
C++ (Qt)
CXEventMachine::subscribe(this, PRISM_EVENT(SelectData), PRISM_METHOD(setSelectData()));

Причем SelectData это по сути текстовая метка, это не сигнал и не слот. setSelectData - это слот.

Испускание события:
Код
C++ (Qt)
CXEventMachine::postEvent(PRISM_EVENT(SelectData));

Это события без параметров.

Есть возможность использовать до 3х параметров в событии:
Код
C++ (Qt)
CXEventMachine::postEvent<QString>(PRISM_EVENT(SelectData), "test");
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #11 : Декабрь 08, 2014, 19:29 »

А что мешает поместить расчет в QObject, запустить его в QThread и связать сигнал окончания этой нити с обновлением окна? Я бы так и сделал... Заодно, если расчёт долгий, будет выполняться где-то в фоне, в идеале на выделенном для этого системой ядре.
Записан

2^7-1 == 127, задумайтесь...
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


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

Ну а почему не банальный синглтон (унаследованный от QObject)? По крайней мере так расчеты могут ничего не знать о наличии Qt. Или это я "перемудрил"?
А зачем синглтон городить там, где он не нужен?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Декабрь 09, 2014, 11:46 »

Ну а почему не банальный синглтон (унаследованный от QObject)? По крайней мере так расчеты могут ничего не знать о наличии Qt. Или это я "перемудрил"?
А зачем синглтон городить там, где он не нужен?
Иногда удобно, использовать что-то одно в качестве "прокси-ретранслятора".
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 09, 2014, 14:33 »

.. Заодно, если расчёт долгий, будет выполняться где-то в фоне, в идеале на выделенном для этого системой ядре.
Чтобы "закрепить ядро" за ниткой - надо сильно постараться, и, насколько помню, такая возможность есть только в unix

Иногда удобно, использовать что-то одно в качестве "прокси-ретранслятора".
Да, примерно такие соображения. Ладно, пока не горит постараюсь осмыслить предложенное _OLEGator_

Спасибо за ответы
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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