Урок №6. Основы работы с GUI в Qt5

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

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

 2818

 ǀ   8 

Ну что, друзья, вот мы и добрались до программирования стандартных графических приложений с помощью Qt5. В этом уроке мы попробуем создать наши первые программы, которые будут содержать такие графические элементы, как: кнопка, значок приложения, всплывающая подсказка, различные курсоры мыши, а также рассмотрим, как можно центрировать окно нашей программы и бегло коснёмся вопроса работы механизма «сигнал-слот».

Простой пример

А начнём мы с простого примера, который отображает на экране стандартное окно:

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


Всплывающая подсказка


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

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


Иконка для приложения

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

Для отображения иконки мы используем метод setWindowIcon() и класс QIcon. Иконка представляет собой небольшой .png файл, расположенный в текущем рабочем каталоге:

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


Курсор


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

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


Кнопка

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

При нажатии на кнопку, генерируется сигнал clicked. Слот — это метод, который реагирует на сигнал. В нашем случае это будет слот quitBtn основного объекта приложения. QApp — это глобальный указатель на объект приложения. Он определён в заголовочном файле QApplication:

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


Взаимодействие виджетов


Мы заканчиваем этот урок примером, который демонстрирует возможность виджетов взаимодействовать друг с другом. Код данного примера разделён на три файла.

Следующий код является заголовочным файлом, в котором мы определяем два слота и виджет lbl.

plusminus.h:

У нас есть две кнопки и виджет lbl. С помощью кнопок мы увеличиваем или уменьшаем число, отображаемое в lbl.

plusminus.cpp:

А здесь происходит соединение сигналов clicked с соответствующими слотами:

В методе OnPlus() мы определяем текущее значение в lbl. Виджет lbl отображает строковое значение, поэтому сначала его нужно преобразовать в целое число. Затем мы это число увеличиваем, конвертируем получившееся число снова в строковое значение и устанавливаем новый текст для label:

А это уже наш основной файл — main.cpp:

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


Заключение

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


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

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

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

  1. Аватар Илья:

    Т.е. в QT есть что-то типа garbage collector? А можно поподробнее, как он здесь работает?

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

      В Qt есть есть класс, который является базовым для всех других классов и объектов. Называется он — QObject. Когда вы создаете свой класс или объект при помощи прямого наследования (непосредственно от QObject) или косвенного (через цепочку промежуточных классов, которые были наследованы от QObject), то вам становится доступен механизм связи объектов, а именно: организация в т.н. иерархии (или деревья объектов). Чтобы его задействовать, нужно при создании объекта-потомка передавать в качестве параметра указатель на объект-предок. И тогда, при удалении родительского объекта, Qt автоматически удалит и всех связанных с ним потомков.

      Пример для наглядности:

  2. Аватар Eugene:

    Простите, вот я такой момент недопонял: в конструкторе классов создаются указатели с выделением памяти. Как потом очищается память? Если эти указатели были бы полями класса, инициализировались в конструкторе и в деструкторе delete`лись, я бы понял. А так получается утечка памяти, вроде как. Поясните этот момент, пожалуйста

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

      >>Как потом очищается память?
      Обратите внимание на второй параметр ("this") в примере ниже:

      В данном случае "this" — это указатель на объект-предок. Если предок будет уничтожен, то Qt автоматически подчистит память за всеми связанными с ним объектами.

      P.S.: В данной статье работа этого механизма не особо заметна, т.к. созданные нами объекты (кнопки, курсоры, подсказки и пр.) живут всё время работы программы. А после завершения работы приложения — операционная система сама позаботится об освобождении всех выделенных ресурсов.

  3. Аватар Sydney:

    Да, очень крутое объяснение, жду с нетерпением следующих уроков.

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

      Спасибо. Новая статья уже передана на корректуру 🙂

  4. Аватар Игорь:

    Жду недождусь новых уроков. Спасибо огромное за Вашу работу.

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

      Всегда пожалуйста 🙂

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

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