Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Frid от Август 04, 2018, 20:07



Название: Сигналы из подклассов
Отправлено: Frid от Август 04, 2018, 20:07
Здравствуйте уважаемые форумчане.

У меня примерно такая структура приложения Qt:
MainWindow -> Player ->  Manager -> (class1, class2, class2)
Собственно MainWindow класс интерфейса, по нажатию кнопки инициализирует класс Player наследованный от QThread. Player же в отдельном потоке читает кадры с камеры в цикле и посылает сигнал в MainWindow для отрисовки кадра. Так же Player инициализирует класс Manager, который получает кадр от Player, режет кадр по каналам и раздает получившиеся изображения трем классам (class1, class2, class2).

Вопрос в том, как из (class1, class2, class2) отправить сигнал в MainWindow?
А наоборот, отправить сигнал из MainWindow в (class1, class2, class2)?

Есть такие мысли:
     1. Передавать ссылку на MainWindow через конструкторы по цепочке до (class1, class2, class2) и в них делать коннект сигналов и слотов; (не пробовал)
     2. Коннектить сигналы к сигналам, т.е. отправлять сигнал от (class1, class2, class2) в Manager, сигнал Manager отправит сигнал в Player, а Player уже отправит сигнал в MainWindow;
     3. По тому же принципу что и 2й способ, только коннектить сигнал-слот и так передавать по цепочке.
На мой взгляд самый адекватный 1й способ (при условии что это сработает).
2й и 3й выглядит как костыль, куча бесполезного кода...

Может есть более элегантное решение такой задачи?






Название: Re: Сигналы из подклассов
Отправлено: RedDog от Август 04, 2018, 20:25
Представьте, что завтра ваш код кто то захочет заюзать с другой гуйней, основанной не на MainWindow (QML например, или веб-морда), а он зачем то в конструкторах будет требовать ссылку на него.


Название: Re: Сигналы из подклассов
Отправлено: Frid от Август 04, 2018, 21:08
Ок, это не есть хорошо. А что вы предлагаете? Делать цепочки геттеров и сеттеров, потом проверять каждую итерацию тот ли результат что мне нужно?


Название: Re: Сигналы из подклассов
Отправлено: RedDog от Август 04, 2018, 21:23
Насколько я понял, то Player это интерфейс некой "бизнес логики". Вот он и должен сигналить о своих изменениях, а кто на них подпишется, уже не его дело.
Ну и таки, да, "проксировать" сигналы снизу вверх, и по пути, на любом слое бизнес логики, им можно модифицировать аргументы, в зависимости от изменений реализации конкретного слоя.
Другими словами, каждый класс это некоторый самодостаточный "черный ящик" со своим АПИ, которым можно пользоваться без дополнительных телодвижений (в данном случае, не передавая туда никакую гуйню).