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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: сигнатуры сигналов/слотов в метаметоде и SIGNAL/SLOT макросы  (Прочитано 9213 раз)
iks
Гость
« Ответ #15 : Июнь 14, 2011, 15:46 »

Ну по простому, сигнал сам по себе, слот тоже живет отдельной жизнью, они связаны через посредника который слушает определеный сигнал, из указаного ему места и тупо отправляет в слот.
У меня есть проги где несколько виджетов получают инфу от одного сигнала, но там передоваемая инфа, QList и слот принимая ее уже смотрит если первая строка не совпадает с его меткой то он не обращает внимания на то что пришло, если совпала то обрабатывает
« Последнее редактирование: Июнь 14, 2011, 15:48 от iks » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #16 : Июнь 14, 2011, 17:59 »

не понятно, к чему все это iks написал, но явно не в ту степь

-----

в общем, пока сделал вариант 2, вроде работает - для тестирования приложение грузит в себя 2 почти одинаковые DLL, в каждой по объекту-истчнику, и он же приемник, приложение формирует при загрузке список загруженных объектов, и привязывается к объектам, чтобы обслуживать связывание сигналов и слотов

когда какому-то объекту вдруг приспичит поменять привязку сигнала, он дергает сигнал, по которому в приложении создается объект, получающий сигнатуру того сигнала или слота, подключение которого надо поменять, он формирует список всех противоположных (для сигнала - слотов, для слота - сигналов) методов других загруженных объектов, и показывает список в листвиджете, в окошке, с флажками вкл-выкл (флажки ессно устанавливаются по состоянию подклчюено или нет)

можно поменять состояния флажков, указав тем самым, новые подключения для текущего сигнала или слота, нажать ОК, и все новые соединения будут установлены, а снятые разорваны...

чтобы все это работало, надо соблюдать одно требование: должны совпадать не только параметры сигнала и слота, которые могут быть соединены, но и их имена - проверка допустимости соединения производится по совпадению имен функций, это специально, чтобы нельзя было соединить абы что с абы чем, только из-за совпадения параметров

пока поиграюсь с таким вариантом, но потом как-нибудь, наверно все-таки переделаю на 1й вариант, с отдельной таблицей, он даст важный бонус - возможность показа не имен классов и методов в них, а произвольные смысловые названия, в том числе, по-русски, но самое главное - соединения так будет проще сохранять и загружать при запуске

мораль - динамически переключать сигналы и слоты друг с другом, по прямому указанию пользователя - не является нерешаемой задачей, и делается относительно несложно

можно будет потом как-нибудь и графический редактор наваять, чтобы просто можно было линии тянуть и ими соединять... и даже нужно будет
« Последнее редактирование: Июнь 14, 2011, 22:13 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #17 : Июнь 15, 2011, 14:50 »

.опа - чтобы при соединении сохранять о нём информацию, надо написать надстройки над QObject::connect() и QObject::disconnect, над разными вариантами, то есть, сделать класс-надстройку над самом QObject, а это применимо только в небольшом числе случаев, если объект наследует QObject напрямую (вариант переписывания QObject в исходниках Qt не рассматривается в принципе, поскольку система может пойти на сертификацию)

никаких других вариантов нет, от connectNotify нет никакого толка, поскольку он никак не получает информацию о подключаемом слоте

есть только один вариант узнать, подключен ли сигнал к слоту - это "2-й способ", описанный выше - прошерстить таблицу объектов, для каждого проверить подключение к его метаметодам, правда есть оказывается способ сделать это немного элегантнее - не отключать и потом подключать снова, а попытаться подключить с параметром Qt::UniqueConnection, тогда если уже подключено, то повторная попытка вернет ошибку, а если ошибки нет, то отключить
Записан

2^7-1 == 127, задумайтесь...
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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