[Devel] Идея привязки событий к виджетам

Evgeny Sinelnikov sin на etersoft.ru
Ср Сен 29 04:14:45 MSD 2010


28 сентября 2010 г. 11:51 пользователь Ilya Shpigor
<shpigor на etersoft.ru> написал:
> Существует проблема.
>

Мы её уже обсуждали и я предложил сразу показывать код. ;)

> Есть виджеты на главной схеме и есть ряд событий которые должны обрабатываться
> (нажатие на виджет).
>
> Сейчас привязка обработчиков событий ко всем виджетам происходит в MainWindow.
>
> Для этого:
> 1. Все виджеты загружаются из glade-файла (т.е. MainWindow получает указатели
> на них)
>
> 2. Для каждого загруженного виджета происходит назначение обработчика
>
> Почему это плохо, думаю, всем понятно (см. код src/GUI/MainWindow.cc и
> src/GUI/MainWindow.h).
>
> В ходе обработки событий может происходить:
> 1. Открытие "Списка параметров" - это создание нового экземпляра ParamViewer
>
> 2. Открытие осциллографа - означает обращение к единственному объекту
> OscilClient, который является атрибутом MainWindow
>
> 3. Печать - еще не реализована, но насколько понимаю здесь тоже будет
> создаваться экземпляр какого-то объекта.
>
> Предложение сдеать так:
> 1. Обработчиком должен быть метод базового класса всех объектов
> (USimpleObject).
>
> Назначение обработчика происходит в этом же базовом классе. При этом дочерние
> виджеты могут вешать свои обработчики нажатия мыши. В Gtk все обработчики
> вызываются по цепочке.
>
> 2. Добавить класс UPopupMenu для абстракции "всплывающее меню".
>
> Этот объект умеет:
> 1) Обрабатывать какждый свой пункт (открывать список параметров, осциллограф,
> распечатывать информацию по объекту)
>
> 2) Генерировать пункты меню по заданному списку датчиков (пункты
> типа "Осциллограф для напряжения")
>
> Соответственно этот объект UObjectMenu должен знать:
> 1) Какой объект его вызвал (указатель на объект типа USimpleObject)
>
> 2) Как работать с ParamViewer
>
> 3) Как работать с печатью
>
> 4) Указатель на глобальный OscilClient и как с ним работать
>

А знать про то сколько отображаемых датчиков присутствует в
USimpleObject ему знать не нужно? Если для ParamViewer и печати
достаточно ожидать, что каждый USimpleObject реализует ещё и интерфейс
GroupObject, то для добавления осциллограм, кроме OscilClient
необходимо знать список датчиков, которые требуется добавить.

> В итоге:
> 1. Виджеты ничего не знают ни про ParamViewer, ни про осцилограф, ни про
> печать
>

Это уже так есть...

> 2. MainWindow ничего не знает про виджеты (не надо их загружать из glade) и не
> содержит реализацию их поведения (обработчики)
>

А вот это совсем непонятно ты как хочешь избежать того, чтобы
MainWindow ничего не знал про виджеты. Я вижу, что класс или
функцию-обработчик действительно можно вынести в отдельный файл.

При этом городить иерархию классов, как мне кажется, совершенно
избыточно. Хотя, в общем случае, это не важно. Важно то, что Список
соответствия между каждым виждетом обрабочиком всё равно где-то должен
быть.

Если  код выносить, то разумно сделать класс. На какой?
Если мы хотим видеть один объект UPopupMenu, то необходимо реализовать
некоторый механизм регистрации, а поскольку состояния у этого объекта,
по сути нет, то и методы у этого нового класса можно сделать
статические...

В общем код можно вынести, список датчиков брать по списку дочерних
классов контейнерных объетов, для которых задано какое-либо
дополнительное свойство... Как-то так я себе это пока представляю.

Хотелось бы видеть более детально представленный интерфейс для
UPopupMenu. Хотелось бы понять на каком этапе инициализируются
обработчики и где происходит привязка widget'ов к обработчикам.
Пересылаю условную схему (widgets and actions), где обозначены
соотвествующие узловые точки.

В общем, код безусловно выносить стоит, но на реальной работе
приложения это никак не скажется. Хотелось бы понять насколько всё
упроститься при исползовании UPopupMenu.

-- 
Sin (Sinelnikov Evgeny)
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : WnA.png
Тип     : image/png
Размер  : 13502 байтов
Описание: отсутствует
Url     : <http://lists.etersoft.ru/pipermail/devel/attachments/20100929/5c1cfd1a/attachment-0001.png>


Подробная информация о списке рассылки Devel