Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[54.84.65.73] |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Вопрос вот в чем ... При создании приложения зачастую приходится организовывать очень большое соединение по сигналам-слотам различных виджетов. Для динамически создаваемых виджетов понятно - после создания вызываем connect, а перед уничтожением - disconnect. И, как правило, соединяем с родительским виджетом. А как правильно быть с теми виджетами, которые один раз создаются при старте программы, и уничтожаются лишь при завершении программы? Мой пример Создается вот какая иерархия: QMainWindow ├─QDocWidget │ └─QWidget-1 ├─QDocWidget │ └─QWidget-2 ├─QDocWidget │ └─QWidget-3 ├─QDocWidget │ └─QWidget-... └─QDocWidget └─QWidget-n В процессе работы программы виджеты QWidget-1 ... QWidget-n должны взаимодействовать друг с другом различными способами. Например, какое-либо действие в QWidget-1 должно для QWidget-2 заставить перерисовать свою внутреннюю таблицу, а в QWidget-n перерисовать внутренние QLabel с каким-то новым текстом. Как поступаю я ... Я связываю все QWidget-1...QWidget-n не друг с другом, а только с QMainWindow. При этом приходится отправлять сигнал QMainWindow, а он уже генерирует нужные сигналы нужным дочерним виджетам. Хотя все и работает, но не нравится мне эта "кухня". Лишние телодвижения, чем сложнее прога - тем запутаннее логика! Выносить же в глобальные переменные QWidget-1 ... QWidget-n и связывать их друг с другом - тоже вроде как не по фэншую, хотя было бы значительно проще. Что присоветуете? Может как-то завязаться на конечный автомат QStateMachine? Или вовсе отказаться от сигналов-слотов и перейти на обмен событиями (хотя сразу понимаю, что это скорее всего глупость)? |
Сообщ.
#2
,
|
|
|
Цитата JoeUser @ Для динамически создаваемых виджетов понятно - после создания вызываем connect, а перед уничтожением - disconnect. disconnect тут не нужен. Если у тебя разрушается приёмник или получатель, то связь разрывается автоматом. Цитата JoeUser @ Выносить же в глобальные переменные QWidget-1 ... QWidget-n и связывать их друг с другом - тоже вроде как не по фэншую, хотя было бы значительно проще. Зачем в глобальные переменные? Создал в родительском все виджеты и там же соединил их. |
Сообщ.
#3
,
|
|
|
Цитата OpenGL @ Зачем в глобальные переменные? Создал в родительском все виджеты и там же соединил их. Ну ок! А если вложенность получается большая? Как мне поступить, если нужно передать сигнал от QWidget1_2_1 в QWidget3_3_1? И особенно это важно на стадии написания проги. Изредка приходится отходить от намеченного плана и слегка менять уже написанный функционал. |
Сообщ.
#4
,
|
|
|
Цитата JoeUser @ если вложенность получается большая? Смотреть по обстоятельствам Лично я стараюсь проектировать виджеты так, чтобы они отвечали только за гуй, и в этом случае у меня не бывает так, чтобы мне нужен был сигнал виджета - "троюродного брата". В этом случае у меня скорее поменяется какое-нибудь внутреннее состояние модели или что там у меня будет, и я брошу сигнал именно от неё. |
Сообщ.
#5
,
|
|
|
А я стараюсь проектировать так, чтоб сигналы от виджетов шли на какой-либо неграфический объект, ответственный за функционал и если нужно обновить какой-то параметр на виджете, то сигнал будет исходить от этого объекта.
|
Сообщ.
#6
,
|
|
|
YuriyRusinov, как на счет QStateMachime в этом качестве?
|
Сообщ.
#7
,
|
|
|
QStateMachine как не крути но это неудобно.
Советую почитать про потерей проектирования. Я к тому, что всё зависит от конкретной задачи и цели. И посмотреть примеры программ. Я бы сделал invalidate и обновление по сигналам. Сигналы и слоты задумывались как коммуникация объектов на горизонтальном уровне, так что через родителя переживать нет смысла. А вот уменьшать связаность имеет смысл. Я выделяют данные(модель) - контроль - отображение. Патерн MVC. И отдельно библиотека с функциями для модели. Виджет включает и контроль и отображение. Данные можно передать любому виджеты и он их может заполнить и проверить. |
Сообщ.
#8
,
|
|
|
Цитата JoeUser @ YuriyRusinov, как на счет QStateMachine в этом качестве? Зависит от предметной области, если мне надо описать какие-то состояния объекта, то вполне, но я работаю немного в другой области, поэтому я просто делаю наследника от QObject, но не QWidget. |