Урок №10. Виджеты в Qt5

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

  Обновл. 26 Дек 2019  | 

 5095

 ǀ   7 

Как вы уже знаете из предыдущих уроков, виджеты в Qt5 — это «строительные блоки» для создания пользовательского интерфейса. Визуальные объекты на форме, такие как кнопки, метки, поля, меню, раскрывающиеся списки и т.д. — всё это относится к виджетам.

В этом уроке мы рассмотрим следующие виджеты, которые присутствуют в Qt5:

   QLabel

   QSlider

   QComboBox

   QSpinBox

   QLineEdit

   QMainWindow

Виджет QLabel

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

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

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

Создаём виджет метки и устанавливаем для него определённый шрифт:

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

Результат:


Виджет QSlider


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

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

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

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

Создаётся горизонтальный QSlider:

Здесь мы подключаем сигнал valueChanged() к встроенному в метку слоту setNum(). Поскольку метод setNum() перегружен, мы используем оператор static_cast для выбора корректного метода:

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

Результат:


Виджет QComboBox

QComboBox — это виджет выбора, который отображает текущий элемент и может отображать выпадающий список выбираемых элементов. Список при этом может быть редактируемым, позволяя пользователю изменять каждый элемент в данном списке.

В следующем примере выбранный элемент из QComboBox будет отображаться в метке.

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

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

В QStringList хранятся данные QComboBox, а именно — список дистрибутивов Linux:

Создаётся QComboBox, и затем с помощью метода addItems() в него добавляются элементы:

Сигнал activated() нашего QComboBox подключается к слоту setText() метки. Поскольку сигнал перегружен, мы делаем статическое преобразование данных при помощи static_cast:

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

Результат:


Виджет QSpinBox


QSpinBox — это виджет, который используется для обработки целых чисел и дискретных наборов значений. Данный виджет позволяет пользователю указать нужное значение либо вручную, либо щёлкая мышью по кнопкам вверх/вниз или нажимая клавиши клавиатуры вверх/вниз для увеличения/уменьшения значения, отображаемого в текущий момент.

В программе ниже с помощью виджета QSpinBox мы можем выбирать число от 0 до 99. Выбранное в текущий момент значение отображается в метке.

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

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

Нам нужно применить преобразование static_cast дважды, потому что и сигнал, и слот перегружены:

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

Результат:


Виджет QLineEdit

Виджет QLineEdit представляет собой редактор однострочного текста. Редактор строки позволяет пользователю вводить одну строку обычного текста и при этом использовать такие функции редактирования, как: отмена, повтор, вырезание, вставка, а также перетаскивание с помощью механизма drag-and-drop.

В следующем примере мы выведем три метки и три строки для редактирования, которые скомпонованы с помощью менеджера компоновки QGridLayout.

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

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

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

Результат:


Строка состояния


Строка состояния (англ. «statusbar») — это панель, которая используется для отображения информации о состоянии приложения. Виджет Statusbar является частью виджета QMainWindow.

В следующем примере у нас есть две кнопки и одна строка состояния. При нажатии на кнопку будет отображаться соответствующее сообщение.

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

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

Виджет QFrame помещается в центральную область виджета QMainWindow. Заметим, что центральную область может занимать только один виджет:

Мы создаём два виджета QPushButton и компонуем их вдоль горизонтальной линии. Родительским элементом кнопок является виджет frame:

Для отображения строки состояния мы вызываем метод statusBar() виджета QMainWindow:

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

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

Результат:


Заключение

Как вы уже могли заметить, виджеты являются простым, но в то же время довольно мощным инструментом построения графической части приложений, созданных при помощи Qt5. В следующем уроке мы продолжим тему виджетов.


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

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

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

  1. Аватар Алексей:

    Здравствуйте , подскажите пожалуйста по поводу перегруженных сигналов и слотов.
    Насколько я понял из документации сейчас предпочтительнее использовать QOverload?
    Так же не совсем понятно, почему мы приводим к указателю на функцию?
    Сигнал подключается к указателю на функцию и мы передаём указатель слоту?
    Запутался, помогите)

  2. Аватар Александр:

    Теперь, кажется, понял.
    Видим, что нам нужен SetNum >>>>> смотрим его в документации и видим, что есть 2 варианта in и double а нам нужен int.

    Просто сама запись static_cast как-то ускользает. Понятно, когда вот так:
    int i = 49;
    char ch = static_cast<char>(i);
    А тут преобразовать в указатель на функцию..

  3. Аватар Александр:

    Добрый день!
    В примере с виджетом QSlider
    в файле slider.cpp
    нехватает мозга понять последнюю строку несмотря на разъяснения.

    отправитель, сигнал,получатель, и вот последний параметр в коннект
    static_cast<void (QLabel::*)(int)>(&QLabel::setNum) что он делает?
    Преобразует в "void (QLabel::*)(int)" значение "(&QLabel::setNum)"
    Т.е. сам static_cast тут непонятен..

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Добрый!
      Смотрите, в самой статье уже идет подсказка:
      >"Поскольку метод setNum() перегружен, мы используем оператор static_cast для выбора корректного метода"

      …ага, если метод перегружен, значит есть и другие? Тогда идем в оф. доки по Qt, смотрим описание класса QLabel (https://doc.qt.io/qt-5/qlabel.html) и видим там две функции setNum():
      >void setNum(double num)
      >void setNum(int num)

      …теперь возвращаемся к строчке с "connect…". Как она работает? Да очень просто — она связывает источник сигнала — slider, сам сигнал — &QSlider::valueChanged, приемник сигнала — label и метод, которым этот сигнала будет обработан (т.е. слот) — функция setNum()…. эмм… а…. а у нас же их две, какая из них должна вызываться? Вот чтобы явно указать, что нам нужен вот такой вариант функции — setNum(int num) — мы и используем вариант приведения к функции void (QLabel::*)(int) через static_cast.

      Ведь что такое — void (QLabel::*)(int)? Это указатель на функцию-элемент класса QLabel, которая принимает в качестве аргумента одну переменную типа int и возвращает void. А такому прототипу соответствует только функция void QLabel::setNum(int num). Тем самым мы ясно дали понять, что хотим использовать в качестве слота (или по-простому — обработчика события) именно её, а не похожую функцию void setNum(double num).
      🙂

      1. Аватар Jane:

        Добрый день. Можете дать ссылку, где в С++ рассказывается про подобное применение static_cast<>? Хотелось бы подробнее вникнуть.

        1. Дмитрий Бушуев Дмитрий Бушуев:

          Добрый.
          Я пользовался этой темой:
          https://ravesli.com/urok-56-yavnoe-preobrazovanie-tipov-dannyh-operatory-casts/#toc-3

      2. Аватар Jane:

        Спасибо за ссылку на static_cast<>

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

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