Урок №11. Виджеты в Qt5 (продолжение)

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

  |

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

 26156

 ǀ   7 

На этом уроке мы продолжим говорить о виджетах в Qt5 (первая часть о виджетах в Qt5). Рассматривать будем следующие виджеты:

   QCheckBox;

   QListWidget;

   QProgressBar;

   QPixmap;

   QSplitter;

   QTableWidget.

Виджет QCheckBox

QCheckBox — это виджет чекбокса (англ. «checkbox»), состоящий из ячейки и подписи к ней. QCheckBox имеет 2 состояния: включено или выключено. При включенном состоянии, внутри ячейки отображается флажок (галочка или крестик), при выключенном — ничего.

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

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

Выводим чекбокс в окне и подключаем его к слоту showTitle().

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

Флажок устанавливается во время запуска программы:

Определяем состояние флажка и вызываем метод setWindowTitle():

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

Результат выполнения программы:


Виджет QListWidget


QListWidget — это виджет, который используется для отображения списка элементов в Qt5. В нашем примере мы покажем, как добавлять, переименовывать и удалять элементы из данного виджета.

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

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

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

Создаем QListWidget и заполняем его пятью элементами:

Добавление нового элемента в виджет списка выполняется с помощью метода addItem():

   данный метод открывает диалоговое окно ввода, которое возвращает строковое значение;

   затем мы удаляем возможные символы пробела из строки с помощью метода simplified();

   метод QString::simplified() возвращает строку, в которой символы пробела удалены в начале и в конце, а все неодиночные пробелы, находящиеся внутри строки, заменены одиночными;

   если возвращаемая строка не пуста, то мы добавляем её в конец виджета списка;

   наконец, выделяем текущий добавленный элемент с помощью метода setCurrentRow().

Код:

Переименование элемента состоит из нескольких шагов:

   сначала мы получаем текущий элемент списка и номер строки, в которой он находится, с помощью метода currentItem();

   текст элемента отображается в диалоговом окне QInputDialog. Строка, возвращаемая из диалогового окна, для удаления потенциальных символов пробела обрабатывается методом simplified();

   затем мы извлекаем старый элемент с помощью метода takeItem() и заменяем его на другой элемент с помощью метода insertItem();

   затем удаляем элемент, извлеченный методом takeItem() (поскольку извлеченные элементы больше не управляются Qt, то это нужно сделать «ручками»);

   наконец, при помощи метода setCurrentRow(), устанавливаем новый текущий элемент.

Код:

Удаление определенного элемента из списка осуществляется с помощью метода removeItem(). Сначала мы получаем текущую строку с помощью метода currentRow() (он возвращает -1, если строк больше не осталось), затем текущий выбранный элемент извлекается с помощью метода takeItem():

Далее метод clear() удаляет все элементы из виджета списка:

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

Результат выполнения программы:


Виджет QProgressBar

QProgressBar — это индикатор процесса (или «индикатор выполнения»), который используется для визуального представления пользователю хода выполнения определенного процесса/операции.

В следующем примере у нас присутствуют QProgressBar и две кнопки. Одна из этих кнопок запускает таймер, который, в свою очередь, обновляет индикатор выполнения. Другая кнопка останавливает таймер.

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

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

QTimer используется для управления виджетом QProgressBar:

Создадим экземпляр QProgressBar. Минимальное и максимальное значения по умолчанию указываются в диапазоне от 0 до 100:

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

Ход выполнения операции сохраняется в переменной progress. Метод setValue() обновляет текущее значение индикатора выполнения:

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

Результат выполнения программы:


Виджет QPixmap


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

В следующем примере мы выведем на экран изображение знаменитого Бойницкого замка, расположенного в центральной части Словакии.

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

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

Мы создаем pixmap — пространство, в которое поместим наше растровое изображение. Затем созданный pixmap мы помещаем в виджет метки:

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

Результат выполнения программы:


Виджет QSplitter

Виджет QSplitter позволяет пользователю управлять размером дочерних виджетов, перетаскивая границу между дочерними элементами.

В следующем примере мы рассмотрим три виджета QFrame, организованных с помощью двух сплиттеров (или «разделителей»).

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

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

Создаем виджет splitter1 и добавляем в него два виджета frame:

Мы также можем добавить один сплиттер к другому сплиттеру:

С помощью метода setSizes() устанавливаем размер дочерних виджетов сплиттера:

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

Результат выполнения программы:

Примечание: В некоторых темах рабочего стола сплиттер может быть не очень хорошо виден.

Виджет QTableWidget


QTableWidget — это уникальный виджет, используемый в приложениях для работы с электронными таблицами (его еще называют «виджетом сетки»). Это один из самых сложных виджетов.

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

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

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

Создаем виджет таблицы с 25-ю строками и 25-ю столбцами:

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

Результат выполнения программы:


Заключение

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

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

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

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

  1. Gleb:

    при создании виджетов мы указываем предка (this). а при добавлении его в grid предком становится grid ? если так , зачем указывать this при создании?

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

      >>при добавлении его в grid предком становится grid ?
      Почти. При добавлении виджета в grid, предком становится тот виджет, в котором этот grid установлен. Более того, предком для виджета может быть только другой виджет, а не компоновка.

      >>если так , зачем указывать this при создании?
      Можно и не указывать. В данном случае вы полностью свободны в своём выборе 🙂

      1. Gleb:

        Спасибо. Очень интересные лекции.

  2. Сергей:

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

  3. Сергей:

    Уточнение:
    Qt Creator 3.5.1 (opensource)
    Основан на Qt 5.5.1 (MSVC 2013, 32 бита)
    Собрано Oct 13 2015 в 07:38:22
    Ревизия e548635a24

  4. Сергей:

    Пробовал запустить Ваш проект "Виджет QPixmap", но картинка в метку не вставляется, т.е. все вроде работает но без картинки. Пробовал вывести разные jpg-файлы, но все без результата. Во время исполнения выдается сообщение "setGeometryDp: Unable to set geometry 27×35+640+282 on QWidgetWindow/'QWidgetClassWindow'. Resulting geometry: 137×35+640+282 (frame: 4, 40, 4, 4, custom margin: 0, 0, 0, 0, minimum size: 27×35, maximum size: 16777215×16777215)."

    Работаю под Windows XP, в Qt Creator 3.5.1 (opensource).
    Можете что-то посоветовать, бьюсь уже несколько дней с разными текстами программ из разных источников, все запускается, но результата вывода jpg-картинок нет. До этого работал с Qt3, там много графики, а сейчас хочу перейти на Qt5….

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

      Ваша программа просто не находит файл с картинкой. Если вы запускаете ваше приложение из Qt Creator'а, то необходимо:
      1.Откройте папку, в которой находится скомпилированная версия вашего приложения. У меня это "build-НАЗВАНИЕ_ПРОЕКТА-Desktop_Qt_5_15_0_MSVC2019_32bit-Debug". У вас скорее всего будет что-то похожее на… "build-НАЗВАНИЕ_ПРОЕКТА-Desktop_Qt_5_5_1_MSVC2013_32bit-Debug".
      2. Скопировать в неё ваш файл с картинкой (проверьте, чтобы имя файла совпадало с именем, прописанным в коде программы).

      Либо же можете напрямую задать путь к вашему файлу с картинкой непосредственно в коде программы. В моём случае это выглядит вот так (не забудьте про двойные слэши):
      "C:\\Coding\\C++\\Qt\\build-untitled4-Desktop_Qt_5_15_0_MSVC2019_32bit-Debug\\bojnice.jpg"

Добавить комментарий для Gleb Отменить ответ

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