сигналы и слоты, передача указателя на мой объект |
Здравствуйте, гость ( Вход | Регистрация )
сигналы и слоты, передача указателя на мой объект |
ieroglif |
31.1.2009, 15:54
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 19.1.2009 Из: планета Земля Пользователь №: 496 Спасибо сказали: 0 раз(а) Репутация: 0 |
ситуация:
имеется ядро, которое подключает к себе кучу самых разных модулей (реализованных в виде шаред библиотек). модули хотят друг с другом общаться. у всех имеется единый интерфейс (логично) от которого они наследуются и по которому они и подгружаются. но конкретная реализация каждого модуля своя. (что, в целом, тоже логично) пример: модуль который отображает значок и меню в трее и модуль игры нарды. не факт что модуль нардов будет, и не факт, что будет модуль трея - это зависит от конкретной установки. но хочется, что бы если они присутсвували оба - модуль "нарды" докидывал в меню трея кнопку "играть в нарды". на данный момент реализация модульного интерфейса такая:
и на данный момент алгоритм вижу следующий: 1. загружаются модули 2. при загрузке они соединяют слоты сигналы sendCommand - getCommand с ядром в обе стороны. Ядро же на какие-то комманды (типа выход) реагирует, а вообще принятый сигнал перекидывает всем модулям, которые уже разбирают на какие комманды и как им реагировать. 3. модуль "нарды" при запуске кидае комманду "добавить элемент в трей-меню". 4. на него реагирует модуль "трей" (если присутсвует, конечно) и коннектит слоты-сигналы с объектом, который пришёл в сигнале. 5. модуль "трей" по новому коннекту кидает что-то типа "готов" и модуль "нарды" закидывает туда готовый QAction* для меню. 6. модуль "трей" разрывает слот-сигнал с "нардами". тем самым я добиваюсь независимости модулей друг от друга. "нарды" знают, что надо отправить запрос ядру на добавления меню, и что если кто-то им потом ответит по другому слоту, кинуть туда элемент меню, а "трей" знает, что если кто-то у него попросит место в трее, то ему пофик кто это - лишь бы кинули потом элемент меню. в целом мне схема нравится, но буду рад другим идеям. на данный момент проблема в том, что я не понимаю, как через слот-сигнал передать указатель на любой объект. в данном примере этот объект - QAction, а другие модули могут меняться какими-то совсем другими данными, объектами и чем угодно. как реализовать? может есть ссылки на маны по построению подобных модульных приложений и их связок? буду рад ответу сюда, или по координатам ася 133733457 скайп ieroglif.ru jabber: ieroglif@jabber.myau.su |
|
|
Litkevich Yuriy |
31.1.2009, 17:01
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
как через слот-сигнал передать указатель на любой объект. передавай указатель на QObject, соответственно все объекты должны быть его наследниками. Это достаточно универсально.Поповоду модобного симбиоза я долго думал, но пока в голове ничего, мне нужно было для "Главного окна" приложения, в котором неготорые возможности становятся доступными посредством плагинов. Была мысль обсудить это дело на форуме, и придумать некий "стандарт" на интерфейс. Но так я и не созрел к этому. |
|
|
ieroglif |
31.1.2009, 17:13
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 19.1.2009 Из: планета Земля Пользователь №: 496 Спасибо сказали: 0 раз(а) Репутация: 0 |
ну типа эта =)
указатель на QObject - это уже приятно, потом просто приводить к нужному типу? если передаю QAction, то QAction object = (QAction)recive_object; ? а если у меня мой "трей" представления не имеет кто у него попросит добавить элемент? как мне приводить тогда объекты? мне же надо ещё и слоты-сигналы соединять.. или я туплю и всё намного проще - я соединяю слоты-сигналы по интерфесу модуля, а там через get/sendData(QObject*) перекидываю что хочу? =) мда.. по ходу действительно туплю.. но тоже полезно иногда =) а обсуждение "стандарта на интерфейс" я как раз и поднимаю и приветсвую =) моё предложение описано выше =) |
|
|
Litkevich Yuriy |
31.1.2009, 17:22
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
указатель на QObject - это уже приятно, потом просто приводить к нужному типу? приведение типов в Qt осушествляется не Си'шным способом, а вот так:если передаю QAction, то QAction object = (QAction)recive_object; ?
хотя можно и Си++'ным, через dynamic_cast |
|
|
SABROG |
31.1.2009, 17:22
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
В QObject'е достаточно информации. Из него ты можешь узнать является ли объект окном, название класса окна (QPushButton, QTreeWidget, QDockWidget, QLabel и т.д.). Список методов, слотов и сигналов, все параметры.
|
|
|
Litkevich Yuriy |
31.1.2009, 17:34
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
в свое время находил проект с классом типа QMainWindow. На самом деле классов там было очень много, и разработаны именно для решения проблем управляемости главного окна. Сейчас наобум прошвырнулся по своим интернет-закладкам и не нашел их сайт
|
|
|
Litkevich Yuriy |
31.1.2009, 20:12
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
как через слот-сигнал передать указатель на любой объект. А может тебе и не надо передавать указатель?Ведь при срабатывании слота ты всегда можешь узнать кто послал сигнал в него используя QObject * QObject::sender () const [protected] :
взято из примера Калькулятор Сейчас наобум прошвырнулся по своим интернет-закладкам и не нашел их сайт нашел!qmdilib |
|
|
ieroglif |
31.1.2009, 20:14
Сообщение
#8
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 19.1.2009 Из: планета Земля Пользователь №: 496 Спасибо сказали: 0 раз(а) Репутация: 0 |
вот на тему сендера - это грамотный ход.
тогда модули станут ещё более независимы =) а ещё у меня была мысль что бы модули регистрировали в ядре комманды, которые их интересуют, что бы ядро рассылало приходящие сигналы только нужным модулям.. но немного подумав, решил, что это только бОльший геморой, и ещё не одназначен прирост производительности. ну явно же не будет в программе лям модулей (да и то лям слотов-сигналов, по утверждению троллей, пройдёт за секунду, так что..) а количество "рассылок" на единицу больше количества модулей в системе.. |
|
|
kuler |
18.2.2009, 19:00
Сообщение
#9
|
Танцор диско Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: -1 |
а сигналы и слоты наследуются?
|
|
|
AD |
18.2.2009, 19:13
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Цитата In Qt, we have an alternative to the callback technique: We use signals and slots. A signal is emitted when a particular event occurs. Qt's widgets have many predefined signals, but we can always subclass widgets to add our own signals to them. A slot is a function that is called in response to a particular signal. Qt's widgets have many pre-defined slots, but it is common practice to subclass widgets and add your own slots so that you can handle the signals that you are interested in Вот эта фраза Цитата A slot is a function that is called in response to a particular signal подразумевает, что слот - эта функция, значит, обладает всеми ее свойствами и наследуется. На счет сигналов, полагаю, что тоже наследуются. Иначе в этом механизме нет особого смысла. |
|
|
Текстовая версия | Сейчас: 30.11.2024, 3:32 |