Практическая работа №14
Первое знакомство с Qt и C++
Section titled “Первое знакомство с Qt и C++”Цель работы:
- Познакомиться со средой разработки Qt Creator.
- Понять, из каких шагов состоит разработка приложения на Qt.
- Научиться создавать простое оконное приложение на Qt Widgets.
- Освоить базовые понятия: проект, интерфейс, сигнал, слот.
- Научиться собирать проект с использованием CMake и связывать элементы через
QObject::connect.
Практическая работа рассчитана на студентов, которые ранее не работали с Qt.
Что мы сделаем в этой работе
Section titled “Что мы сделаем в этой работе”В результате выполнения работы вы создадите приложение GreetingApp, которое:
- Принимает имя пользователя из поля ввода.
- При нажатии кнопки выводит персональное приветствие.
- Ведет журнал (историю) приветствий с указанием времени.
- Позволяет очищать историю.
Краткие теоретические сведения
Section titled “Краткие теоретические сведения”Что такое Qt?
Section titled “Что такое Qt?”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. Создание проекта
Section titled “Шаг 1. Создание проекта”- Запустите Qt Creator.
- Нажмите File → New File or Project.
- Выберите Application (Qt) → Qt Widgets Application → Choose….
- Имя проекта:
GreetingApp. Путь: выберите вашу рабочую папку. - Система сборки: CMake.
- Class Information: оставьте всё по умолчанию (
MainWindow). - Kits: выберите доступный (например, Desktop Qt 6.x.x GCC 64bit).
- Нажмите Finish.
Шаг 2. Проектирование интерфейса (Qt Designer)
Section titled “Шаг 2. Проектирование интерфейса (Qt Designer)”- В дереве проекта слева откройте Forms → mainwindow.ui. Откроется визуальный редактор.
- Перетащите из панели слева (Widget Box) следующие элементы:
- Label: измените текст на “Введите ваше имя:”.
- Line Edit: это поле ввода. В панели свойств (справа) измените
objectNameнаnameInput. - Push Button: текст “Поздороваться”,
objectName—greetButton. - Push Button: текст “Очистить историю”,
objectName—clearButton. - List Widget: это список для журнала.
objectName—historyList.
- Компоновка: Кликните правой кнопкой на пустом месте формы → Lay Out → Lay Out Vertically. Теперь элементы будут аккуратно растягиваться.
Шаг 3. Описание слотов в заголовочном файле
Section titled “Шаг 3. Описание слотов в заголовочном файле”Откройте файл mainwindow.h. Нам нужно объявить функции (слоты), которые будут срабатывать при нажатии кнопок.
Добавьте секцию private slots в класс MainWindow:
#ifndef MAINWINDOW_H#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACEnamespace 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();}Шаг 5. Сборка и запуск
Section titled “Шаг 5. Сборка и запуск”- Нажмите на иконку зеленого молотка (Build) в левом нижнем углу. Убедитесь, что в панели “Compile Output” нет красных ошибок.
- Нажмите на зеленый треугольник (Run).
- Проверьте работу:
- Введите имя и нажмите “Поздороваться”.
- Попробуйте нажать кнопку с пустым полем.
- Нажмите “Очистить историю”.
Задания для самостоятельного выполнения
Section titled “Задания для самостоятельного выполнения”- Валидация: Измените код так, чтобы в журнал нельзя было добавить одно и то же имя дважды подряд.
- Стилизация: В файле
mainwindow.cppв конструкторе добавьте строку, меняющую цвет текста в списке:ui->historyList->setStyleSheet("color: blue;"); - Счетчик: Добавьте на форму еще один
QLabelи обновляйте его текст, показывая общее количество приветствий в списке.
Контрольные вопросы
Section titled “Контрольные вопросы”- В каком файле описывается внешний вид окна?
- Зачем нужен макрос
Q_OBJECTв заголовочном файле? - Что делает функция
ui->nameInput->text()? - Как работает функция
connect? Перечислите её 4 аргумента. - Какую роль выполняет библиотека
<QMessageBox>?