QStackedWidget: Вариант реализации Прокси-виджета для блокировки Ui

QStackedWidget: Вариант реализации Прокси-виджета для блокировки Ui

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

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

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

Для создания эффекта блокировки мы:

  1. Делаем скриншот виджета (он расположен на первой странице QStackedWidget), который собираемся заблокировать, с помощью QProxy::grabWidget();
  2. Закрашиваем получившееся изображение полупрозрачным серым цветом;
  3. Устанавливаем изображение в QLabel, который находится на соседней странице QStackedWidget;
  4. Переключаемся на страницу с подготовленным на предыдущем шаге QLabel.

В примере переход между режимами осуществляется с помощью гиперссылок Active и Passive.

Реализация не намного сложнее идеи. Файл proxywidgetdemo.h:

Файл proxywidgetdemo.cpp:

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

  1. Нам приходится явно обрабатывать событие resizeEvent(), когда мы находимся в режиме блокировки, поскольку само по себе изображение не обновится;
  2. QLabel, в который мы выводим «заблокированное» изображение, пришлось поместить в QScrollArea с отключенными полосами прокрутки, поскольку иначе уменьшение окна в режиме блокировки становилось невозможным. Кроме того, для QLabel установлен режим выравнивания по левому верхнему краю для предотвращения «скачков» картинки при изменении размеров окна.

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий