Как сделать окно модальным c

Добавил пользователь Валентин П.
Обновлено: 05.10.2024

Диалоговое окно - это форма, обладающая некоторыми специальными характеристиками. Первая отличительная черта большинства диалоговых окон - то, что их размер изменять нельзя. Кроме того, в диалоговых окнах обычно не используются элементы управления , помещаемые в верхнюю часть обычных форм: ControlBox , MinimizeBox и MaximizeBox . Для пользователя диалоговое окно в противоположность обычному является практически неизменяемым.

Диалоговые окна бывают модальные и немодальные. Если приложение открывает модальное окно, то работа приложения блокируется до тех пор, пока не будет закрыто модальное окно. Немодальные окна могут работать одновременно с породившим их главным окном приложения. Такие окна часто используются для "плавающих" инструментальных панелей, настройки различных параметров приложения, причем отсутствие модальности позволяет использовать в приложении измененные параметры, не закрывая окна настройки этих параметров.

Когда пользователь щелкает кнопку ОК, метод Show возвращает значение , равное DialogResult.OK

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

Прототип наиболее общего варианта метода MessageBox.Show , позволяющий реализовать практически все возможности диалогового окна MessageBox, приведен ниже

Параметр caption позволяет задать текст заголовка диалогового окна MessageBox. С помощью параметра btns можно указать, какие кнопки необходимо расположить в окне диалогового окна. Этот параметр задается константами из перечисления MessageBoxButtons ( таблица 4.1)

Это именно те проблемы, с которыми вы столкнетесь, если вызовете Application.DoEvents () внутри цикла. Это один из способов заставить форму вести себя модально, не отключая другие окна. Например:

Безусловно, лучше всего использовать модальные формы так, как они были разработаны, чтобы избежать неприятностей. Если вам не нужна модальная форма, просто не делайте ее модальной, используйте метод Show (). Подпишитесь на его событие FormClosing, чтобы знать, что оно скоро закроется:

На самом деле ответ очень прост. Пытаться

Это откроет новую форму, а родительская будет недоступна.

Мне кажется, что вы могли бы использовать приложение MDI, устанавливающее форму № 0 IsMdiContainer значение true.

Тогда вы можете сделать что-то подобное:

Используя ShowDialog () как вы указали в своем вопросе, чтобы все формы были Modal = true.

По определению модальная форма:

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

Вы можете использовать это свойство [( Modal )], чтобы определить, отображалась ли форма, полученная вами из метода или свойства, модально.

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

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

  • Что вы хотите сделать, кроме того, чтобы сделать вашу основную форму адаптивной и т. Д.
  • Что тебе нужно делать?

Ваша основная форма не будет реагировать, пока не будут закрыты модальные диалоговые окна, находящиеся в том же пространстве процесса. Для этого нет никакого решения.

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

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

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

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

Выбор типа диалогового окна основывается на здравом смысле и относится к этапу юзабилити-тестирования. Мы этого вопроса касаться не станем. Рассмотрим лишь технику создания и тех, и других диалоговых окон с помощью Qt.

Класс диалогового окна

Реализуем простой класс диалогового окна. Именно его мы попробуем вызывать в модальном и немодальном режимах.

qt-easy-dialog

На нашем диалоговом окне мы разместили одно поле ввода и три кнопки: OK , Apply и Cancel .

Кнопка OK предназначена для подтверждения ввода с последующим закрытием окна. Этого мы добились, связав сигнал щелчка по кнопке со стандартным слотом QDialog::accept() .

Кнопка Apply так же предназначена для подтверждения ввода. Но предполагает продолжение работы с диалоговым окном. Для реализации такой логики мы предусмотрели сигнал applied() .

Последняя кнопка Cancel просто закрывает диалоговое окно. Больше ничего не происходит. Введенные данные отклоняются. Для этого мы используем слот QDialog::reject() .

Других кодов в QDialog не предусмотрено (кроме Accepted и Rejected ). Поэтому существует слот QDialog::done( int ) . Он закрывает окно и возвращает в качестве результата вызова указанное целочисленное значение.

Нажатие клавиши Esc в диалоговом окне приводит к вызову QDialog::reject() , а Enter связывается с кнопкой по умолчанию. Такой кнопкой становится либо первая добавленная кнопка (в нашем случае OK ), либо кнопка, для которой вызвана функция btn->setDefault( true ) .

Чтобы извлечь введенное значение в текстовое поле, мы предусмотрели константную функцию-член getInput() .

Реклама

Модальное диалоговое окно

Реализуем виджет, который будет использовать наше диалоговое окно:

qt-parent-widget

Виджет содержит текстовое поле и две кнопки. Первая предназначена для вызова модального диалогового окна, а вторая - для немодального. Сосредоточимся на первой.

Модальное диалоговое окно обеспечивает блокировку вызывающей функции с помощью вызова exec() (как у QApplication ). Это дает нам полное право создавать такой диалог в виде локальной переменной. Обращаю внимание, что в конструкторе диалогового окна мы передаем указать на виджет. Это обеспечивает необходимую привязку.

Мы должны не забыть привязать сигнал applied() нашего диалогового окна к специально созданному слоту onApplied() . В нем мы просто устанавливаем значение введенной строки в качестве значения текстового поля виджета.

Момент отображения диалогового окна соответствует строке с вызовом dlg.exec() . В качестве ответа возвращается код завершения работы окна. Единственный интересный для нас случай: QDialog::Accepted . Для него мы делаем то же самое, что и в слоте onApplied() .

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

Реклама

Немодальное диалоговое окно

Добавим реализацию слота onNonModalDemo() для вызова нашего диалогового окна в немодальном режиме:

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

Для обработки ответа QDialog::Accepted мы делаем привязку к сигналу диалогового окна accepted() . Есть аналогичный сигнал для отрицательного ответа rejected() . А также для нашего собственного кода результата (на случай вызова слота done( int ) ): finished( int ) .

Важным отличием является то, что отображаем диалог мы не с помощью exec() , а путем вызова show() .

Освобождать указатель на немодальное диалоговое окно нам не нужно. Это произойдет автоматически при вызове деструктора родительского виджета. В этот же момент диалоговое окно закроется.

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

Выводы

9 простых правил, которые помогут вам создать более удачный дизайн модальных окон

Jul 12, 2021 · 5 min read


Модальное окно — это такое окошко, которое появляется поверх родительского экрана. Его называют модальным, потому что оно вызывает состояние, при котором главная страница уходит на второй план, но все еще остается в поле зрения. Пользователю предлагается выполнить какое-либо действие, чтобы вернуться к основному окну.

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

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


Модальное окно в формате “Загрузка…” является довольно распространённой практикой для уведомления о длительных операциях. Использование модальных окон в таких случаях можно считать логичным, поскольку такое окно не позволяет пользователю взаимодействовать с экраном. Однако можно найти и более подходящее решение — добавление на сайт строки загрузки прямо в кнопку, которая начинает действие. Такое решение будет сигнализировать о том, что нужно немного подождать, и не дает пользователю снова нажать на кнопку загрузки.

Уведомление об успешном выполнении всегда лучше выводить либо прямо внутри интерфейса, либо на отдельной странице.

Примечание: модальные окна можно использовать в том случае, если пользователю необходимо совершить действие, которое может иметь серьезные последствия или которое трудно или невозможно отменить.


2. Осторожнее с модальными окнами, вызываемыми системой

Есть два типа модальных окон: вызываемые пользователем и вызываемые системой:

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

Дизайнеры обычно используют такие окна в рекламных целях. Такие окна прерывают пользователя и заставляют его выполнить какое-либо определенное действие. “Незваные” окна часто производят плохое впечатление на пользователей — люди инстинктивно ищут кнопку “закрыть”. Такие окна считаются раздражающими и неуместными.


3. Убедитесь, что пользователи понимают, что от них требуется

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

К примеру, если пользователь хочет удалить свои файлы, то вместо того, чтобы спрашивать “Очистить хранилище?” с ответами “Да” или “Нет”, лучше спросить “Вы точно хотите удалить свои файлы?” с вариантами “Удалить” и “Отмена”.

4. Выносите содержимое сайта и его активные кнопки в модальные окна

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

  • В идеале, модальное окно должно содержать пару-тройку предложений, а также не более двух кнопок действия.
  • Третье действие, например кнопка “Узнать больше”, лишь уводит пользователя от основного окна и не дает ему завершить желаемое действие.

5. Делайте кнопки закрытия окна видимыми

Пользователи должны иметь возможность закрыть модальное окно, когда им вздумается. Вот несколько способов, как этого добиться:

  • Добавить заметную кнопку “Закрыть” или “×” в правом верхнем углу окна.
  • Добавить заметную кнопку “Закрыть” или “Отменить” в нижней части окна.
  • Добавить возможность закрытия модального окна при клике за его пределами.

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

7. Выделяйте модальные окна

Вот как можно дать пользователям понять, что перед ними модальное окно:

  • Поместите модальное окно прямо в поле зрения пользователя. Если модальное окно появляется за пределами экрана, то человеку придется скроллить, чтобы его найти, а это является плохой практикой. Проблема в том, что пользователь может не понять, что нужно скроллить куда-то по странице, это может привести к путанице.
  • Убедитесь, что модальное окно визуально отличается от фоновой страницы. Затемнение фона окна поможет пользователям понять, что оно расположено поверх основного сайта.

8. Сделайте содержимое модального окна доступным для пользователей с клавиатурой (для ПК)

Как только на странице открывается модальное окно, фокус страницы должен быть переведен на него. Пользователь должен иметь возможность перемещаться по функциональным элементам управления в окне с помощью клавиатуры.

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

9. Не используйте вложенные модальные окна

Никогда не создавайте модальные окна, которые могут вызывать новые модальные окна. Такой подход создает визуальный бардак в дизайне сайта.

Читайте также: