На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> Qt5: Правильное "общение" виджетов
    Всем привет!

    Вопрос вот в чем ... При создании приложения зачастую приходится организовывать очень большое соединение по сигналам-слотам различных виджетов. Для динамически создаваемых виджетов понятно - после создания вызываем connect, а перед уничтожением - disconnect. И, как правило, соединяем с родительским виджетом.

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

    Мой пример

    Создается вот какая иерархия:

    ExpandedWrap disabled
      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? Или вовсе отказаться от сигналов-слотов и перейти на обмен событиями (хотя сразу понимаю, что это скорее всего глупость)?
      Цитата JoeUser @
      Для динамически создаваемых виджетов понятно - после создания вызываем connect, а перед уничтожением - disconnect.

      disconnect тут не нужен. Если у тебя разрушается приёмник или получатель, то связь разрывается автоматом.

      Цитата JoeUser @
      Выносить же в глобальные переменные QWidget-1 ... QWidget-n и связывать их друг с другом - тоже вроде как не по фэншую, хотя было бы значительно проще.

      Зачем в глобальные переменные? Создал в родительском все виджеты и там же соединил их.
        Цитата OpenGL @
        Зачем в глобальные переменные? Создал в родительском все виджеты и там же соединил их.

        Ну ок! А если вложенность получается большая? Как мне поступить, если нужно передать сигнал от QWidget1_2_1 в QWidget3_3_1? И особенно это важно на стадии написания проги. Изредка приходится отходить от намеченного плана и слегка менять уже написанный функционал.
          Цитата JoeUser @
          если вложенность получается большая?

          Смотреть по обстоятельствам :-? Лично я стараюсь проектировать виджеты так, чтобы они отвечали только за гуй, и в этом случае у меня не бывает так, чтобы мне нужен был сигнал виджета - "троюродного брата". В этом случае у меня скорее поменяется какое-нибудь внутреннее состояние модели или что там у меня будет, и я брошу сигнал именно от неё.
            А я стараюсь проектировать так, чтоб сигналы от виджетов шли на какой-либо неграфический объект, ответственный за функционал и если нужно обновить какой-то параметр на виджете, то сигнал будет исходить от этого объекта.
              YuriyRusinov, как на счет QStateMachime в этом качестве?
                QStateMachine как не крути но это неудобно.

                Советую почитать про потерей проектирования. Я к тому, что всё зависит от конкретной задачи и цели. И посмотреть примеры программ.

                Я бы сделал invalidate и обновление по сигналам. Сигналы и слоты задумывались как коммуникация объектов на горизонтальном уровне, так что через родителя переживать нет смысла.
                А вот уменьшать связаность имеет смысл.

                Я выделяют данные(модель) - контроль - отображение. Патерн MVC. И отдельно библиотека с функциями для модели. Виджет включает и контроль и отображение. Данные можно передать любому виджеты и он их может заполнить и проверить.
                  Цитата JoeUser @
                  YuriyRusinov, как на счет QStateMachine в этом качестве?

                  Зависит от предметной области, если мне надо описать какие-то состояния объекта, то вполне, но я работаю немного в другой области, поэтому я просто делаю наследника от QObject, но не QWidget.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0338 ]   [ 17 queries used ]   [ Generated: 19.03.24, 08:49 GMT ]