Skip to content

Практическая работа №14

Первое знакомство с Qt и C++

Section titled “Первое знакомство с Qt и C++”

Цель работы:

  • Познакомиться со средой разработки Qt Creator.
  • Понять, из каких шагов состоит разработка приложения на Qt.
  • Научиться создавать простое оконное приложение на Qt Widgets.
  • Освоить базовые понятия: проект, интерфейс, сигнал, слот.
  • Научиться собирать проект с использованием CMake и связывать элементы через QObject::connect.

Практическая работа рассчитана на студентов, которые ранее не работали с Qt.


Что мы сделаем в этой работе

Section titled “Что мы сделаем в этой работе”

В результате выполнения работы вы создадите приложение GreetingApp, которое:

  1. Принимает имя пользователя из поля ввода.
  2. При нажатии кнопки выводит персональное приветствие.
  3. Ведет журнал (историю) приветствий с указанием времени.
  4. Позволяет очищать историю.

Краткие теоретические сведения

Section titled “Краткие теоретические сведения”

Qt — это библиотека и фреймворк для создания приложений с графическим интерфейсом на языке C++.
Одно и то же приложение Qt может работать в Windows, Linux и macOS.

Сигналы и слоты (через QObject::connect)

Section titled “Сигналы и слоты (через QObject::connect)”
  • Сигнал — сообщение о событии (например, нажали кнопку clicked).
  • Слот — обычная функция-член класса, которая выполняется в ответ на сигнал.

Для связи сигнала и слота используется функция connect. В современном Qt (Qt 5/6) рекомендуется использовать синтаксис с указателями на методы:

// Синтаксис:
// connect(КТО_ОТПРАВЛЯЕТ, &КЛАСС::СИГНАЛ, КТО_ПРИНИМАЕТ, &КЛАСС::СЛОТ);
connect(ui->myButton, &QPushButton::clicked, this, &MainWindow::handleButtonClick);

Порядок выполнения работы (ПОШАГОВО)

Section titled “Порядок выполнения работы (ПОШАГОВО)”
  1. Запустите Qt Creator.
  2. Нажмите File → New File or Project.
  3. Выберите Application (Qt) → Qt Widgets ApplicationChoose….
  4. Имя проекта: GreetingApp. Путь: выберите вашу рабочую папку.
  5. Система сборки: CMake.
  6. Class Information: оставьте всё по умолчанию (MainWindow).
  7. Kits: выберите доступный (например, Desktop Qt 6.x.x GCC 64bit).
  8. Нажмите Finish.

Шаг 2. Проектирование интерфейса (Qt Designer)

Section titled “Шаг 2. Проектирование интерфейса (Qt Designer)”
  1. В дереве проекта слева откройте Forms → mainwindow.ui. Откроется визуальный редактор.
  2. Перетащите из панели слева (Widget Box) следующие элементы:
    • Label: измените текст на “Введите ваше имя:”.
    • Line Edit: это поле ввода. В панели свойств (справа) измените objectName на nameInput.
    • Push Button: текст “Поздороваться”, objectNamegreetButton.
    • Push Button: текст “Очистить историю”, objectNameclearButton.
    • List Widget: это список для журнала. objectNamehistoryList.
  3. Компоновка: Кликните правой кнопкой на пустом месте формы → Lay Out → Lay Out Vertically. Теперь элементы будут аккуратно растягиваться.

Шаг 3. Описание слотов в заголовочном файле

Section titled “Шаг 3. Описание слотов в заголовочном файле”

Откройте файл mainwindow.h. Нам нужно объявить функции (слоты), которые будут срабатывать при нажатии кнопок.

Добавьте секцию private slots в класс MainWindow:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
// Наши будущие функции для кнопок
void onGreetClicked();
void onClearClicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Шаг 4. Реализация логики и соединение (connect)

Section titled “Шаг 4. Реализация логики и соединение (connect)”

Откройте файл mainwindow.cpp. Здесь мы напишем код функций и “подключим” их к кнопкам.

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QMessageBox> // Для всплывающих окон
#include <QDateTime> // Для работы со временем
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ШАГ 4.1: Соединяем сигналы кнопок с нашими слотами
// Соединяем кнопку "Поздороваться"
connect(ui->greetButton, &QPushButton::clicked, this, &MainWindow::onGreetClicked);
// Соединяем кнопку "Очистить"
connect(ui->clearButton, &QPushButton::clicked, this, &MainWindow::onClearClicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
// ШАГ 4.2: Реализация функции приветствия
void MainWindow::onGreetClicked()
{
// Получаем текст из поля ввода
QString name = ui->nameInput->text().trimmed();
// Проверка: если имя пустое
if (name.isEmpty()) {
QMessageBox::warning(this, "Ошибка", "Пожалуйста, введите имя!");
return;
}
// Формируем строку приветствия
QString greeting = "Привет, " + name + "!";
// Получаем текущее время
QString time = QDateTime::currentDateTime().toString("HH:mm:ss");
// Добавляем в список (журнал)
ui->historyList->addItem("[" + time + "] " + greeting);
// Очищаем поле ввода для следующего раза
ui->nameInput->clear();
}
// ШАГ 4.3: Реализация очистки
void MainWindow::onClearClicked()
{
ui->historyList->clear();
}
  1. Нажмите на иконку зеленого молотка (Build) в левом нижнем углу. Убедитесь, что в панели “Compile Output” нет красных ошибок.
  2. Нажмите на зеленый треугольник (Run).
  3. Проверьте работу:
    • Введите имя и нажмите “Поздороваться”.
    • Попробуйте нажать кнопку с пустым полем.
    • Нажмите “Очистить историю”.

Задания для самостоятельного выполнения

Section titled “Задания для самостоятельного выполнения”
  1. Валидация: Измените код так, чтобы в журнал нельзя было добавить одно и то же имя дважды подряд.
  2. Стилизация: В файле mainwindow.cpp в конструкторе добавьте строку, меняющую цвет текста в списке:
    ui->historyList->setStyleSheet("color: blue;");
  3. Счетчик: Добавьте на форму еще один QLabel и обновляйте его текст, показывая общее количество приветствий в списке.

  1. В каком файле описывается внешний вид окна?
  2. Зачем нужен макрос Q_OBJECT в заголовочном файле?
  3. Что делает функция ui->nameInput->text()?
  4. Как работает функция connect? Перечислите её 4 аргумента.
  5. Какую роль выполняет библиотека <QMessageBox>?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. Документация QPushButton (сигналы)
  2. Работа со строками QString
  3. Сигналы и слоты: подробный гид