crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Получается монстр
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 1.12.2018, 7:24
  Анна, лично я вообще не пользуюсь сигналами и слотами кроме тех, которые уже есть в классах Qt :) То есть, не ввожу новых

И всё прекрасно получается.

В твоём случае контейнер всех элементов можно сделать глобальным (учесть синхронизацию доступа, если имеется многопоточность). И пусть кто угодно и где угодно пишет и читает без слотов. А уведомления можно оставить сигналами, либо свою очередь уведомлений сделать

Анна Дата 30.11.2018, 17:27
  Есть у меня огромная структура, которая представляет из себя внутренности некоторого устройства.
Изначально требовалось приложение, которое скачивает в эту структуру из устройства значения, что-то меняет, записывает обратно.
Потом появилась надобность в другом приложении, пользующемся этой же структурой, потом ещё одно приложение...

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

С одной стороны у меня есть ощущение, что делаю правильно (классы не зависят друг от друга, можно собирать их в какие угодно конструкции), с другой стороны класс практически состоит из нескольких десятков сигналов и нескольких десятков слотов. Вместо такого:

class Interface
{
...
   void setManager(Manager *m) {m_manager = m;};
   void foo1();
   void foo2()
...
   Manager *m_manager;
};

Interfase::foo1()
{
   m_manager->setValueA(val);
}

Interface::foo2()
{
   int val = m_manager->valueA();
}



у меня получились :

class Interface
{
...
   void foo1();
public slot:
   void foo2(int);

signal:
   void valueARequired(); // интерфейсу требуется значение A
   void valueAChanged(int); // интерфейс изменил значение A

...
};


void Intreface::foo1()
{
...
   emit valueAChanged(val);
}

Interface::foo2(int a)
{
   int val = a;
...
}


Ну, и, конечно же, есть в главном окне штабеля коннектов:

connect(interface, SIGNAL(valueAChanged(int)), manager, SLOT(setValueA(int))); 
connect(interface, SIGNAL(valueAChanged(int)), manager, SLOT(setValueA(int)));
connect(manager, SIGNAL(valueAChanged(int)), interface, SLOT(foo2(int)));
...


Классов типа Interface несколько (они абсолютно разные. Среди них есть и QWidget и QObject), каждому нужны различные значения из структуры, спрятанной в Manager, каждый хочет какие-то поля менять и получать уведомления об изменениях.
Мне вот интересно, это нормально нормальный подход к решению - всё решать через сигнал-слот, или нужно всё-таки делать гибрид, когда есть и обращение к менеджеру через указатель и с помощью сигналов, слотов и connect()? И, вообще, когда какое решение лучше применять? По ходу, получается паттерн Наблюдатель, но только оба класса являются взаимными Наблюдателями.

Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 14:12