Название: проектирование пользовательского интерфейса Отправлено: qt_newer от Июль 15, 2014, 14:42 Надо сделать приложение для виндоуз эмбеддед. Много форм (у всех есть заголовок, 2 кпонки внизу), в этих формах различные элементы управления, например, текст ареа, инпут бокс и т.п. Сказали, что так как надо экономить время-память, все делать в одной форме, динамически меняя элементы в ней. Классы надо спроектировать соответственно для элементов управления (включающие валидатор, установку стиля, изменение значений и т.п.) Посоветуйте, пжл, какие-нибудь примеры подобного, или просто идеи, не знаю, как подойти к делу :(
Название: Re: проектирование пользовательского интерфейса Отправлено: qt_newer от Июль 15, 2014, 15:23 работать должно на QT 4.8 (max), т.е. без QML
Название: Re: проектирование пользовательского интерфейса Отправлено: Susenin от Июль 15, 2014, 16:13 Расскажите подробнее, что конкретно не понятно?
Пока такие советы: 1. Максимально отделить GUI от логики работы программы (ядра). GUI должен быть незатейливым проводником сигналов между пользователем и ядром. 2. Возможно, требования к программе еще не до конца сформировались и будут меняться по ходу разработки программы. Надо предусмотреть эту возможность. Если вы создадите динамическое изменение компонентов на одной форме, вас ждет много боли, когда требования к GUI будут меняться. Пишите программу со стандартным подходом, не запариваясь на экономию памяти и остального. Вот когда напишете, протестируете, тогда и будете оптимизировать GUI. У вас это легко получится, ведь вы GUI хорошо отделили от ядра по моему первому совету ;D Название: Re: проектирование пользовательского интерфейса Отправлено: qt_newer от Июль 15, 2014, 16:53 Спасибо за ответ, но начальство говорит заморачиваться, значит заморачиваться :(
Это мой первый проект на кьют (знания чисто теоретические), а программа уже существует на другой платформе (чужая, кода у меня нет)- просто перевести надо, начав с ГУИ. Не понятно, как правильно сделать динамическое изменение элементов и классы спроектировать. Приложение выглядит примерно так: выбор режима просмотра- режим 1- ввод данных- ввод след. данных, возврат на главную страницу, режим 2- ввод- проверка, изменение фона на красный для неверных данных- снятие отпечатков и т.п. и т.д. Много, много форм- переход между ними туда-обратно, еще куда-то в середину :) Т.е. ответ, например, использовать QtStackedWidget, сделать несколько страниц с кнопками внизу и менять у них надписи, слоты по ходу дела (только как пример!). Классы для кнопки, инпут бокса, текст ареа и т.п. создам, надеюсь, самостоятельно :) Название: Re: проектирование пользовательского интерфейса Отправлено: Bepec от Июль 15, 2014, 17:12 Не страдайте геморроем :)
Делать полностью динамический интерфейс можно, но это приведёт к перерасходу времени, нервов и денег. Одна правка и у вас полетит всё/вся и вы будете страдать в прямом смысле этого слова. Разделите всё на формы. Потом формы создавайте динамически на главном виджете. Вот и весь сказ. PS а если говорят что "память сбережёт", то думать люди не умеют. Если сделать "наслаивающийся интерфейс", то он всегда будет в памяти. А динамически подгружаемые формы только в момент пользования :) Название: Re: проектирование пользовательского интерфейса Отправлено: qt_newer от Июль 15, 2014, 17:29 даа, а мне-то как не хочется этим заниматься. Вариант "создать форму и удалить ее сразу после использования" был предложен мной первым, в ответ было сказано, что будет медленно. (целевое устройство совсем слабенькое). Про "наслаивающийся интерфейс" не знаю, м.б. имелось в виду, что каждый элемент управления создается, удаляется по мере использования (гмм, и на это тоже время идет ?)
Название: Re: проектирование пользовательского интерфейса Отправлено: Susenin от Июль 15, 2014, 20:14 Вариант "создать форму и удалить ее сразу после использования" был предложен мной первым, в ответ было сказано, что будет медленно. (целевое устройство совсем слабенькое). Сделайте тестовое приложение, две насыщенные формы. Поочереди их создавайте, показывайте и удаляйте. Замерьте время. Будут хоть какие-то данные.Название: Re: проектирование пользовательского интерфейса Отправлено: Igors от Июль 15, 2014, 20:24 Т.е. ответ, например, использовать QtStackedWidget, сделать несколько страниц с кнопками внизу и менять у них надписи, слоты по ходу дела (только как пример!). Ну а почему бы и нет? Чем это "сложнее" расхристанных "форм" (какое мерзкое слово) у которых одинаковые эл-ты? Или просто так - ругать глупость начальства = хороший тон? :) Название: Re: проектирование пользовательского интерфейса Отправлено: Bepec от Июль 15, 2014, 20:56 Чем гибче система, тем больше в ней ошибок и тем страшнее последствия каждой :)
Название: Re: проектирование пользовательского интерфейса Отправлено: Old от Июль 15, 2014, 21:05 Чем гибче система, тем больше в ней ошибок и тем страшнее последствия каждой :) Ерунда.Название: Re: проектирование пользовательского интерфейса Отправлено: _OLEGator_ от Июль 15, 2014, 21:07 Чем гибче система, тем больше в ней ошибок и тем страшнее последствия каждой :) Полный бред.Название: Re: проектирование пользовательского интерфейса Отправлено: Bepec от Июль 15, 2014, 21:08 А чем вы руководствовались когда писали 2 последние реплики? Если без грамотной архитектуры гибкая система, то это капец. А тут как раз такой случай.
Название: Re: проектирование пользовательского интерфейса Отправлено: Old от Июль 15, 2014, 21:10 А чем вы руководствовались когда писали 2 последние реплики? Если без грамотной архитектуры гибкая система, то это капец. А тут как раз такой случай. Без грамотной архитектуры гибкой системы не получиться, ну никак. :)Название: Re: проектирование пользовательского интерфейса Отправлено: _OLEGator_ от Июль 15, 2014, 21:14 А чем вы руководствовались когда писали 2 последние реплики? Если без грамотной архитектуры гибкая система, то это капец. А тут как раз такой случай. А чем ты руководствуешься, когда пишешь такие утверждения? Эпоха монолитных приложений уже давно прошла, а рукожопие и гибкость - разное.Название: Re: проектирование пользовательского интерфейса Отправлено: Bepec от Июль 15, 2014, 21:42 Цитировать Чем гибче система, тем больше в ней ошибок и тем страшнее последствия каждой Вот моё утверждение :) Скажите ещё, что в монолитном больше ошибок будет :) Чем гибче, тем больше сценариев. Чем больше сценариев - больше обработчиков. Больше обработчиков - больше ошибок. По статистике :) Название: Re: проектирование пользовательского интерфейса Отправлено: _OLEGator_ от Июль 15, 2014, 21:49 Пффф. Гибкая система подразумевает слабую связанность и компактность ее частей, которые можно легко изменять/заменять/расширять. Каждый класс должен выполнять строго свою конкретную функцию, в отличие от суперклассов. Ну и т.д.
Название: Re: проектирование пользовательского интерфейса Отправлено: qt_newer от Июль 15, 2014, 23:52 Спасибо всем за ответы! Было бы здорово получить какие-то конкретные советы по динамическому проектированию, а еще лучше примеры. В составе Qt Creator пока ничего похожего найти не удалось. Или, все-таки, разбить приложение на несколько основных форм, а внутри них уже организовать динамику? Это было бы самым логичным, имхо, но начальство уже на этапе выбора режима работы приложения- первая форма с двумя кнопками: режим 1, режим 2- хочет одну форму :(
Название: Re: проектирование пользовательского интерфейса Отправлено: Bepec от Июль 16, 2014, 00:20 Для пользователя не будет никакой визуальной разницы. Что несколько динамических форм, что полностью гибкий интерфейс. Это имеет значение только для программиста :D
Название: Re: проектирование пользовательского интерфейса Отправлено: Igors от Июль 16, 2014, 10:41 Ну вот, пошла "архитектура", "слабая связанность и компактность" и.т.п. :) А какие собственно проблемы делать все в 1 форме? Удачные обобщения наверняка найдутся, вообще что здесь "страшно-архитектурного"? :)
Было бы здорово получить какие-то конкретные советы по динамическому проектированию, а еще лучше примеры. Есть термин "динамическое программирование", классический примерЦитировать Есть N монеток, у каждой свой номинал. Какое минимальное число монеток нужно чтобы получить заданную сумму S ? Это не то что Вы хотели - но тоже (зато) интересно Название: Re: проектирование пользовательского интерфейса Отправлено: ViTech от Июль 16, 2014, 12:28 Спасибо всем за ответы! Было бы здорово получить какие-то конкретные советы по динамическому проектированию, а еще лучше примеры. В составе Qt Creator пока ничего похожего найти не удалось. Или, все-таки, разбить приложение на несколько основных форм, а внутри них уже организовать динамику? Это было бы самым логичным, имхо, но начальство уже на этапе выбора режима работы приложения- первая форма с двумя кнопками: режим 1, режим 2- хочет одну форму :( Susenin в самом начале дал дельные советы, к которым я тоже рекомендую прислушаться. У вас уже есть функциональное ядро программы, к которому надо прилепить GUI? Или начальство хочет в динамический интерфейс динамический функционал вставить? :) Если хотите конкретики, то нарисуйте хоть на бумаге набор необходимых форм, тогда будет понятно, как много там всего меняется, и как лучше это реализовать. И здесь примеры предоставьте, чтобы могли конкретные советы давать.Вообще, похоже, то что вы хотите получить, реализовано в QML, который использовать нельзя :). Думаю, в любом случае, пригодится погуглить "state machine gui". Название: Re: проектирование пользовательского интерфейса Отправлено: Susenin от Июль 16, 2014, 16:42 Я тут подумал, что можно сделать так:
1. Создаем минимально необходимый пул виджетов, которые нужны для проектирования. Т.е. если форм всего 10, и на каждой не больше 2-х кнопок, значит в пуле всего 2 кнопки. При старте приложения заполняем пул. Код: std::vector<QWidget *> widgets; 2. Нужно создать классы-описания формы. Если при стандартном подходе эти классы генерит uic из *.ui файлов, тот тут их нужно создать самим. Первое что приходит в голову - копипастой. И заменить в методе Код: void setupUi(QWidget *) Для этого: Создаем вспомогательный проект. В нем создаем столько *.ui файлов, сколько форм в приложении. Редактируем их в Дизайнере до полного удовлетворения. После прохода uic по *.ui файлам получаем несколько ui_<имя_ui_файла>.h файлов. Далее копируем их в свой проект, изменяем создание виджетов на выбор из пула. Я бы просто в методе Код: void setupUi(QWidget *) Пока выглядит несложно. Как только форма скрывается - ее нужно удалять, которая появляется - создавать. Это будет работать быстро, ведь нет выделения памяти, только выбор из пула и настройка виджетов под новый вид. Название: Re: проектирование пользовательского интерфейса Отправлено: qt_newer от Июль 16, 2014, 17:36 Спасибо! А у меня сегодня появилась такая идея (частично реализованная):
свой класс лейаут (на основе грида): у него 3 раздела- заголовок, центральная изменяемая часть и управление (2 кнопки) потом много классов виджетов: виджет создается, устанавливается для центральной части, потом удаляется, создается след., опять устанавливается и т.д. И соответственно, меняются управлящие кнопки: их слоты, заголовки. Это должно работать для одной ветви проекта, потом надо как-то реализовать переключение между ветвями. Вообщем, заранее спасибо за любые идеи-примеры, как это сделать правильно (вкл. создание своего класса лейаут) Название: Re: проектирование пользовательского интерфейса Отправлено: Igors от Июль 16, 2014, 17:45 Или начальство хочет в динамический интерфейс динамический функционал вставить? :) Ну это вряд ли :)Создаем вспомогательный проект. В нем создаем столько *.ui файлов, сколько форм в приложении. Редактируем их в Дизайнере до полного удовлетворения. Полностью согласенПосле прохода uic по *.ui файлам получаем несколько ui_<имя_ui_файла>.h файлов. Далее копируем их в свой проект, изменяем создание виджетов на выбор из пула. Совершенно не согласен. Не нужна тонна файлов что наколбасил дизайнер. Гораздо лучше задействовать QFormBuilder и грузить прямо ui файл. Тогда легко сделать общую часть, напрКод Смысл - одна переменная для всех форм, а имя "button1" обеспечим в дызайнере. |