Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Апрель 22, 2018, 09:47



Название: Сомнительное место в UI
Отправлено: Igors от Апрель 22, 2018, 09:47
Добрый день

Есть график на котором рисуются контрольные точки которые могут быть выбраны рамкой (и подсвечены). А вот нажатие мышей на точку не делает ее "выбранной". Менять такой ф-ционал нельзя.

Юзер просит по нажатию на точку показать в статус баре ее значение, чтобы можно было его редактировать. А при нажатии мышей в др место скрыть. Вроде разумно, но находится масса др мест где нужно также скрыть (напр сам график удален или сменился, точку замочили с клавы и.т.п) - и во все эти места надо вставлять злополучное скрытие edit box'а. Как-то "нездорово" получается, мелкий ф-ционал вызывает массу забот. Как это порешать?  Может богатырской силой какого-то паттерна и все такое?

Спасибо


Название: Re: Сомнительное место в UI
Отправлено: kambala от Апрель 22, 2018, 10:36
получится по сигналу destroyed выбранной точки скрывать edit box?


Название: Re: Сомнительное место в UI
Отправлено: Igors от Апрель 22, 2018, 13:35
получится по сигналу destroyed выбранной точки скрывать edit box?
Нет, точка - скромный эл-т контейнера, делать ее наследником QObject не с руки. Удаление полностью контролируется контейнером, там можно отловить, но опять-таки - это всего лишь одно место (из очень многих)


Название: Re: Сомнительное место в UI
Отправлено: ssoft от Апрель 23, 2018, 07:54
... Может богатырской силой какого-то паттерна и все такое?

Богатырский паттерн - единый контроллер данных. Единый объект, который имеет возможность управлять всеми данными - добавлять/удалять/выделять/и т.д., а также сигнализировать об изменениях.
Тогда удаление точек может происходить только через экземпляр объекта контроллера, так как только он владеет данными. А edit box может быть незамедлительно оповещен об удалении точек из любого места любым способом с помощью получения соответствующего сигнала от контроллера.


Название: Re: Сомнительное место в UI
Отправлено: Igors от Апрель 23, 2018, 08:27
Тогда удаление точек может происходить только через экземпляр объекта контроллера,
Ну так и есть, удалять может только контейнер - почему нельзя считать его "контроллером"?

А edit box может быть незамедлительно оповещен об удалении точек из любого места любым способом с помощью получения соответствующего сигнала от контроллера.
Ой. Это выходит из-за сущей мелочи в UI каждая точка пуляет сигналами? Та ну нафиг

Есть такие (смутные) соображения. Ну если юзверь тыкнул в др место - отслеживаем явно и скрываем editBox. Иначе он видим пока точка рисуется в данном окне. "Давайте сделаем точку шаред пойнтером" (и потом подскоком weak) - ну это слишком жирно. Как бы в эту точку "вцепиться"?


Название: Re: Сомнительное место в UI
Отправлено: ssoft от Апрель 23, 2018, 11:51
Если вкладывает в понятие "контейнер" модель поведения, то это уже не просто контейнер в виде структуры хранения.
Контроллер может состоять не из одного контейнера, а иметь, например, несколько контейнеров, дополнительные структуры, флаги, списки и т.п.
Назначение контроллера - обеспечить модель поведения, а не каким то определенным образом хранить данные.
Например, модели Qt (QAbstractItemModel) являются контроллерами данных.

Точки как раз не пуляют сигналами, а делает это контроллер, типа сигнала dataChanged().


Название: Re: Сомнительное место в UI
Отправлено: Авварон от Апрель 23, 2018, 16:32
Например, модели Qt (QAbstractItemModel) являются контроллерами данных.

Вообще-то, модели являются моделями:)
Контроллер - это то, что реагирует на инпут от пользователя (QAbstractItemView в архитектуре Model-View)


Название: Re: Сомнительное место в UI
Отправлено: ssoft от Апрель 23, 2018, 17:26
Вообще-то, модели являются моделями:)

Да). Я чего-то спросонья модель контроллером обозвал))). Пардонте.


Название: Re: Сомнительное место в UI
Отправлено: Igors от Апрель 24, 2018, 10:38
Ну вот и развернулась теоретическая дискуссия :) Контроллер то, контроллер се. Сомневаюсь что здесь он вообще имеет отношение к делу. Нужно поймать место в коде где можно удачно проверить editBox на валидность. Думаю такое место есть - это рисование точки которой сейчас посвящен editBox. Ну сама точка вряд ли, рисование ее запросто отсечет. А если так (псевдокод)
Код
C++ (Qt)
struct СEdtPointLocator {
const Container * mContainer;  // контейнер точки
int mIndex;             // индекс точки  
const CDataPoint * mPoint;  // адрес точки
const CData & mEditData;   // см ниже
};
 
Рисование проверяет рисуется ли mContainer, валиден ли индекс и совпадает ли адрес. Что-то не прошло - испускается сигнал на скрытие editBox. Да, так я могу поймать ABA, поэтому на всякий случай надо еще и данные сравнить

Сейчас знатоки скажут: это как же так, "голые" указатели и без всяких паттернов! Не-не, это не может быть правдой! Ну так попинайте


Название: Re: Сомнительное место в UI
Отправлено: Racheengel от Апрель 24, 2018, 13:34
А если edit box модально вызывать? Пока юзер сам его не скроет - дальше не пущать...


Название: Re: Сомнительное место в UI
Отправлено: Igors от Апрель 25, 2018, 13:03
А если edit box модально вызывать? Пока юзер сам его не скроет - дальше не пущать...
Ну такие рецепты помогают скорее доктору чем больному  :)