Графический интерфейс с ручным кодированием и графический интерфейс Qt Designer [закрыто]

StackOverflow https://stackoverflow.com/questions/387092

Вопрос

Эти каникулы я провожу, учась писать приложения на Qt.Всего несколько часов назад я читал о Qt Designer, и это заставило меня задуматься:что люди, пишущие реальные приложения на Qt, используют для разработки своих графических интерфейсов?Фактически, как люди вообще проектируют графические интерфейсы?

Я, например, обнаружил, что писать код вручную концептуально проще, чем использовать Qt Designer, хотя для сложных графических интерфейсов Designer может иметь смысл.Большие графические интерфейсы могут быть возможны с помощью Designer, но со временем ими может стать очень сложно управлять по мере увеличения сложности (это только мое мнение).Я также загрузил исходный код AmaroK, чтобы посмотреть, что делают эти ребята, и нашел много вызовов addWidget() и его друзей, но ни один из этих XML-файлов, созданных Designer (кроме:AmaroK должно быть моим любимым приложением на любой платформе).

Какой же тогда «правильный» способ создания графического интерфейса?Дизайнер или код?Давайте для этого обсуждения рассмотрим следующие типы графических интерфейсов:

  1. Простые диалоги, в которые нужно просто ввести данные, показать результат и выйти.Предположим, что приложение принимает URL-адрес YouTube и загружает видео на жесткий диск пользователя.Типы приложений, с которыми, скорее всего, начнет работать новичок.
  2. Графические интерфейсы среднего уровня, такие как, скажем, редактор заметок с несколькими элементами панели инструментов/меню.Возьмем, к примеру, xPad (http://getxpad.com/).Я бы сказал, что большинство приложений относятся к категории «утилиты».
  3. Очень сложные графические интерфейсы, такие как AmaroK или OpenOffice.Вы узнаете их, когда увидите, потому что от них у вас кровоточат глаза.
Это было полезно?

Решение

Наш опыт работы с Designer начался с Qt3.

Qt3

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

Qt4

Qt4 значительно улучшил Designer.Он больше не только генерирует код, но вы можете динамически загружать файлы Designer (в формате xml) и динамически подключать их к работающим объектам вашей программы -- нет сгенерированного кода, однако вам нужно давать имена элементам в Designer и придерживаться названий, чтобы не нарушить ваш код.

По моей оценке, он далеко не так полезен, как Interface Builder в Mac OS X, но на данный момент я могу использовать файлы Designer непосредственно в программе.

Мы не возвращались к Designer со времен Qt3, но по-прежнему используем его для создания прототипов и отладки макетов.

По вашим проблемам:

  1. Вероятно, вам сойдет с рук использование стандартных диалогов, предлагаемых Qt.QInputDialog или если вы создаете подкласс QDialog, обязательно используйте QButtonDialogBoxчтобы убедиться, что ваши кнопки имеют правильное расположение платформы.

  2. Вероятно, вы могли бы сделать что-то более ограниченное, например xPad, с ограниченной функциональностью Designer.

  3. Я бы не подумал, что можно написать что-то вроде OpenOffice исключительно с помощью Designer, но, возможно, дело не в этом.

Я бы использовал Designer как еще один инструмент, такой же, как ваш текстовый редактор.Как только вы обнаружите ограничения, попробуйте другой инструмент для решения этой новой проблемы.Я полностью согласен со Стивом С., что одним из преимуществ Designer является то, что макет может сделать кто-то другой, не являющийся программистом.

Другие советы

По моему опыту работы с Qt Designer и другими наборами инструментов/UI-инструментами:

  • Инструменты пользовательского интерфейса ускоряют работу.
  • Инструменты пользовательского интерфейса упрощают последующую настройку макета.
  • Инструменты пользовательского интерфейса упрощают и делают возможным работу над дизайном пользовательского интерфейса для непрограммистов.

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

Я не обнаружил, что масштаб проекта имеет какое-либо значение.Ваш опыт может отличаться.

Файлы, созданные с помощью инструментов пользовательского интерфейса (я думаю, вы могли бы написать их вручную, если бы действительно захотели), часто могут быть динамически загружены во время выполнения (Qt и GTK+ предоставляют эту возможность).Это означает, что вы можете вносить изменения в макет и тестировать их без перекомпиляции.

В конечном счете, я думаю, что и сырой код, и инструменты пользовательского интерфейса могут быть эффективными.Вероятно, это во многом зависит от среды, набора инструментов/UI-инструмента и, конечно же, личных предпочтений.Мне нравятся инструменты пользовательского интерфейса, потому что они позволяют мне быстро приступить к работе и позволяют легко вносить изменения позже.

Организация, в которой я работаю, несколько лет назад портировала свое приложение с графическим интерфейсом на Qt.Думаю, стоит упомянуть несколько аспектов:

  • Работа с Qt Designer, по крайней мере на тот момент, была нереальной:было слишком много функций, которые нельзя было реализовать с помощью Qt Designer;
  • Соглашения и структура, которые необходимо было сохранить, не позволяли использовать Qt Designer;
  • Если вы начали без Designer, вернуться к нему, вероятно, будет сложно;
  • Однако наиболее важным аспектом было то, что программисты привыкли программировать с использованием vi или emacs, а не GUI IDE.

Мой собственный опыт, датируемый ок.4 года использования Qt3.3 заключается в том, что в Designer не удалось реализовать динамическое поведение в диалогах.

Просто хочу сказать, что я писал и поддерживал сложные графические интерфейсы на Qt без использования Qt Designer — не потому, что мне не нравится Qt Designer, а потому, что я никогда не удосуживался работать таким образом.

Частично это вопрос стиля и вашего происхождения:Когда я начал работать с Qt, у меня был ужасный опыт работы с Dreamweaver, Frontpage и другими визуальными инструментами HTML, и я предпочитал писать код с помощью HomeSite и прибегать к Photoshop для решения сложных проблем с макетом.

Существует опасность, связанная с IDE для визуального кода, что вы пытаетесь сохранить визуальные инструменты, но в конечном итоге вам также приходится настраивать код - способами, которые не до конца понятны.

Например, изучая разработку для iPhone, мне было неприятно нажимать на «волшебные» визуальные элементы («перетаскивание из пустого круга в инспекторе подключений к объекту в окне Interface Builder...»), которые были бы проще (для меня), чтобы понять это в простом старом коде.

Удачи вам с Qt — это отличный набор инструментов, как бы вы его ни использовали, а Qt Creator выглядит как отличная IDE.

Добавлю, что одной из причин использования графического дизайнера было, например, отсутствие менеджеров по расположению в Win32.Было возможно только абсолютное позиционирование, и делать это вручную было бы просто отстойно.

С тех пор как я перешел с Delphi на Java для приложений с графическим интерфейсом (еще в 2002 году), я больше никогда не пользовался услугами дизайнеров.Мне гораздо больше нравятся менеджеры по расположению.И да, вы получаете шаблонный код, но перемещение объектов в дизайнере пользовательского интерфейса может занять столько же времени, сколько и изменение шаблонного кода.Кроме того, я бы остановился на медленной IDE;это для случая Java/C#, хорошо, а для Qt (особенно Qt4) это неприменимо.Для Qt3 интересно, зачем редактировать сгенерированный код - нельзя ли было добавить код в другие файлы?По какой причине?

О обсуждаемых случаях:1) Графический интерфейс с ручным кодированием, вероятно, будет писаться быстрее, по крайней мере, если вы знаете свои библиотеки.Если вы новичок и не знаете их, вы можете сэкономить время и меньше учиться у дизайнера, поскольку вам не нужно изучать API, которые вы используете.Но ключевым фактором является «учиться меньше», поэтому в обоих случаях я бы сказал, что графический интерфейс с ручным кодированием.

2) Строки меню довольно утомительны для написания кода.Также подумайте о таких деталях, как ускорители и так далее.Тем не менее, это зависит от того, к чему вы привыкли.Через некоторое время может быть быстрее напечатать этот шаблон, чем щелкнуть мышью в дизайнере, чтобы исправить все эти свойства, но только если вы действительно можете печатать, как на пишущей машинке (как те администраторы, для которых ввод команд Unix выполняется быстрее, чем используя любой графический интерфейс).

3) Я бы расширил ответ на случай № 2 до этого.Обратите внимание, что для платформ Win32 возможно использование конструкторов, генерирующих ресурсы Win32. возможно быстрее загружается (без понятия об этом).

Однако я хотел бы упомянуть о потенциальной проблеме с использованием Qt Designer.Реальный случай:потребовалось несколько секунд (скажем, 10), чтобы загрузить сложное диалоговое окно Java (диалоговое окно «Настройки» для текстового редактора программиста) с множеством опций.Правильным решением было бы загружать каждую из вкладок только тогда, когда программист хотел их видеть (я понял это позже), добавляя отдельный метод к каждому набору предпочтений для создания его графического интерфейса.

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

Одним из основных преимуществ использования конструктора для создания графических интерфейсов является то, что другие программисты могут легко изменять или поддерживать формы и виджеты без необходимости вникать в сложный код.

Странно, что вы говорите, что писать код проще, чем манипулировать объектами в графической среде.Это несложно.
Дизайнер призван облегчить вашу жизнь и в долгосрочной перспективе сделать ваш код более удобным в сопровождении.Проще посмотреть в дизайнере, как выглядит ваш пользовательский интерфейс, чем читать код и пытаться представить, как он может выглядеть.
С текущим Qt вы можете делать практически все из дизайнера, а те немногие вещи, которые вы не можете сделать, можно исправить с помощью всего лишь нескольких строк кода в конструкторе.Возьмем, к примеру, самый простой пример — добавление соединения сигнального слота.Пользоваться дизайнером так же просто, как двойной щелчок.Без дизайнера вам нужно найти правильную подпись сигнала, отредактировать файл .h, а затем отредактировать и записать свой код в файл .cpp.Дизайнер позволяет вам быть выше этих деталей и сосредоточиться на том, что действительно важно — функциональности вашего приложения.

Мне нравится сначала обращаться к дизайнеру для разработки виджетов с графическим интерфейсом.Как упоминалось в других постах, это быстрее.Вы также получаете немедленную обратную связь, чтобы увидеть, «выглядит ли это правильно» и не сбивает ли пользователя с толку.Дизайнер — основная причина, по которой я предпочитаю Qt другим инструментариям.В основном я использую дизайнер для создания одноразовых диалогов.

При этом главное окно и любые сложные виджеты я делаю вручную.Я думаю, что это именно то, что задумал Тролльтек. QFormLayout — это класс, который они предоставляют для простого программного создания диалога ввода.

Кстати, конструктор в Qt 4 — это не IDE, как тот, что был в Qt 3.Это просто редактор для редактирования файлов .ui.Мне это нравится.Новая кроссплатформенная IDE будет называться Qt Creator.

Это старый пост, но я бы посоветовал вам взглянуть на Clementine — музыкальный проигрыватель, который (я думаю) произошел от Amarok.Они используют Qt4, и, насколько я вижу, есть пользовательский интерфейс папка в папке источник папка проекта.в пользовательский интерфейс папка, как и следовало ожидать, в ней есть всевозможные файлы .ui.Если вы скомпилируете и запустите Clementine, вы увидите, что графический интерфейс довольно сложен и довольно приятен.

Для меня это зависит от того, насколько логика инкапсулирован в виджет/графический интерфейс.Если речь идет только о простых формах, я предпочитаю использовать QtDesigner.

Если он содержит сложные проверки или взаимодействия, я склонен его программировать.

Мы используем Qt Designer, если кому-то нужно создать графический интерфейс.
Суть в том, чтобы создать небольшие виджеты для определенных задач (как если бы вы делали это при проектировании классов), а затем объединить их в «родительский графический интерфейс».

Таким образом, ваши виджеты можно многократно использовать и использовать в Guis по модульному принципу.Вам просто нужно указать, какие сигналы отправляет каждый виджет и какие слоты он предоставляет.

Мы также создаем файлы .ui, которые могут быть созданы в процессе сборки.До сих пор не было необходимости редактировать эти файлы вручную.

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

Есть вещи, которые вы не можете сделать в Qt Designer, вы можете сделать только в коде.
поэтому Qt Designer — это всего лишь одна (отличная) часть цепочка инструментов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top