Россия и Беларусь начали и продолжают войну против народа Украины!

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

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

  |

  Обновл. 16 Сен 2021  | 

 19650

 ǀ   3 

Сегодня мы создадим свой собственный виджет. Обычно, большинство инструментариев содержат лишь самые распространенные наборы виджетов, например, стандартные кнопки, слайдеры и т.п. Так как при этом ни один инструментарий не может обеспечить пользователя каким-нибудь универсальным набором виджетов на все случаи жизни, то перед программистами возникает вопрос о необходимости создания своего собственного инструментария. Исходя из этого, можно выделить два основных пути решения: программист может изменить/улучшить существующий виджет или он может создать свой собственный виджет с нуля в 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 (20 оценок, среднее: 4,85 из 5)
Загрузка...

Комментариев: 3

  1. Finchi:

    Осторожно, Qt6! 🙂
    Cделал аналогичный виджет, который, на мой взгляд, получился более универсальным.

    Qt6 в Microsoft Visual Studio 2022 Enterprise Edition:

    ProgressLine.h

    ProgressLine.cpp

    Burning.h

    Burning.cpp

    main.cpp

     

  2. Vlad:

    Присоединяюсь к вопросу. Хотелось бы видеть свои виджеты слева в колонкe дизайнера форм. Как их туда вставить?

  3. John Meow:

    Как сделать, чтобы этот виджет показывался в редакторе форм?

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

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