QWizard: Создание Мастера в Qt

QWizard Создание Мастера в Qt

QWizard (называется Мастером или Визардом) позволяет легко создавать приложения, которые проводят пользователя по линейной последовательности страниц. Преимущество такого подхода заключается в том, что попасть на следующую страницу нельзя до тех пор, пока все предыдущие не окажутся корректно заполнены. Это упрощает программирование и дает пользователю лучше понять, что от него все же просят.

Займемся разработкой простого Мастера. Мастер будет состоять из трех страниц:

  1. Начальной, где пользователь сможет ввести свое имя, а также выбрать путь дальнейшего движения по Мастеру;
  2. Промежуточной, которая зависит от данных, введенных пользователем на начальной странице;
  3. Финальной, которая обычно позволяет последний раз подумать, и принять окончательное решение о вступлении изменений в силу. Мы же просто попрощаемся с пользователем.

Подготовительный этап

Для осуществления навигации по Мастеру нам понадобятся идентификаторы страниц. Создадим заголовочный файл shared_defs.h:

Назначение всех идентификаторов вполне понятно по названиям соответствующих констант, поэтому двигаемся дальше.

Начальная страница

Все страницы Мастера в Qt должны реализовывать класс QWizardPage. Создадим страницу IntroPage. Вот ее заголовочный файл intropage.h:

Функции-члены nextId() и validatePage() перегружают виртуальные функции QWizardPage. Посмотрим на их реализацию в файле intropage.cpp:

Конструктор IntroPage занимается инициализацией структуры страницы. В нем мы определяем заголовок и подзаголовок с помощью setTitle() и setSubTitle(). Затем компонуем содержимое страницы, состоящее из поля ввода QLineEdit, текстовой метки QLabel и двух радио-кнопок QRadioButton.

Наиболее интересным местом конструктора является строка:

Таким образом мы регистрируем поле ввода, содержимое которого доступно на любой странице Мастера под текстовым идентификатором userName. При этом оно объявляется обязательным полем с помощью символа звездочки * в конце имени userName*. Это означает, что пользователь не сможет перейти на следующую страницу Мастера, если не заполнит это поле ввода. Такое ограничение достигается за счет того, что кнопка Далее окажется неактивной при пустом значении имени пользователя.

Передать значение с одной страницы Мастера на другую можно и без привязки к текстовому полю. Для этого существует функция-член setField(). В качестве первого параметра она принимает текстовый идентификатор, а в качестве второго — произвольный объект, обернутый в QVariant.

Функция-член nextId() возвращает числовой идентификатор следующей страницы. Значение определяется в соответствии с выбором той или иной радио-кнопки.

Проверка обязательного поля на пустое значение хорошо. Если оно удовлетворено, то кнопка Далее уже становится доступной для нажатия. Но этого не всегда достаточно. Дополнительную проверку позволяет выполнить функция-член validatePage(). Для текстовых полей можно было бы использовать QValidator, но мы упрощаем задачу, и лишь проверяем, чтобы имя было не короче двух символов. В случае нарушения условия на форме выводится сообщение об ошибке. Это происходит после нажатия на кнопку Далее.

Если все условия выполнены, то после нажатия на кнопку Далее мы попадаем на промежуточную страницу. Реализуем ее.

Промежуточная страница

Заголовочный файл middlepage.h:

Заметим несколько деталей:

  1. Конструктор MiddlePage в качестве первого входного параметра принимает строку подзаголовка. Это позволит нам различать две страницы, на которые можно попасть с первой путем выбора той или иной радио-кнопки;
  2. Помимо знакомой нам уже виртуальной функции nextId() перегружается initializePage(). Она вызывается каждый раз, когда Мастер попадает на страницу после нажатия кнопки Далее (но не Назад) на предыдущей странице.

Переходим к реализации:

Обратим внимание на вызов setCommitPage( true ) в конструкторе MiddlePage. После него страница становится «контрольной». Кнопка Далее на ней меняется на кнопку Подтвердить. После нажатия на эту кнопку вернуться назад уже нельзя. В нашем примере это не так полезно, но знать о такой возможности не помешает.

Функция initializePage() довольно проста, но раскрывает одну из основных возможностей QWizard — передачу значений между страницами. Получить строку с именем пользователя, зарегистрированную через идентификатор userName можно с помощью field( "userName" ). Это мы и делаем, формируя приветственную надпись.

В качестве следующей страницы мы выбрали финальную. Поэтому nextId() возвращает ее числовой идентификатор FINAL_PAGE.

Финальная страница

Определим страницу FinalPage в заголовочном файле finalpage.h:

А теперь реализация в finalpage.cpp:

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

Компонуем приложение

Главный файл реализации main.cpp:

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

Поздравляю! Приложение на основе QWizard готово!

Замечание

На самом деле, мы рассмотрели только самые базовые принципы работы с классом Мастера в Qt. Но этого материала уже достаточно для создания полнофункциональных программ. Продвинутое использование QWizard откладываем на будущее.

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