Урок №13. Создание пользовательского виджета в Qt5

  Дмитрий Бушуев  | 

  Обновл. 12 Янв 2020  | 

 1422

В этой части руководства по Qt5/C++ мы создадим свой собственный виджет. Обычно, большинство инструментариев содержат лишь самые распространённые наборы виджетов, по типу стандартных кнопок, слайдеров и т.д. Так как при этом ни один инструментарий не может обеспечить пользователя каким-нибудь универсальным набором виджетов на все случаи жизни, то перед программистами возникает вопрос о необходимости создания своего собственного инструментария. Исходя из этого, можно выделить два основных пути решения: программист может изменить/улучшить существующий виджет или он может создать свой собственный виджет с нуля в Qt5.

Виджет записи данных на диск

В примере ниже мы с нуля создадим пользовательский виджет, имитирующий процесс записи данных на диск. Подобный виджет можно встретить в таких программах для записи дисков, как Nero Burning Rom, BurnAware, ImgBurn или K3B.

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

Метод getCurrentWidth() используется для определения значений ползунка:

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

Файл реализации — burning.cpp:

При перемещении ползунка вызывается слот valueChanged():

Когда мы изменяем значение ползунка слайдера, то сначала сохраняем новое значение, а затем перерисовываем пользовательский виджет:

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

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

Ниже следуют несколько важных констант:

   DISTANCE — это расстояние между значениями шкалы.

   LINE_WIDTH — это длина вертикальных линий-насечек шкалы.

   DIVISIONS — это количество частей шкалы.

   FULL_CAPACITY — это ёмкость «диска». После его достижения происходит т.н. перепрожиг. Перепрожиг (англ. «Overburning») — это процесс записи информации на диск объёмом большим, чем определено изначально. В этом случае для записи дополнительных данных используются так называемые резервные дорожки диска. Данный этап визуализируется красным цветом.

   MAX_CAPACITY — это максимальная ёмкость носителя.

Код:

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

Файл реализации — widget.cpp:

Рисование пользовательского виджета делегируется методу drawWidget():

Данные числа используются для отображения масштаба виджета:

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

Получаем значение переменной cur_width:

Используем переменную width для выполнения преобразований между значениями шкалы и размерами пользовательского виджета:

Данные линии рисуют красный прямоугольник, указывающий на перепрожиг:

Рисуем небольшие вертикальные линии:

Рисуем числа шкалы. Чтобы точно расположить числа, мы должны получить ширину строки:

Главный файл программы — main.cpp:

Результат:

Заключение


На этом всё. В следующем уроке мы с вами попробуем создать свой аналог простой игры «Змейка».

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (8 оценок, среднее: 4,75 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *