Лаб. работа “Библиотеки и средства внедрения визуальных компонент для организации GUI-интерфейсов пользователя. Обработка событий”
Цель работы
Освоить создание графического интерфейса с использованием библиотеки Qt Widgets. Разработать интерфейс простого мессенджера: размещение виджетов с помощью менеджеров компоновки, визуальное проектирование и обработка событий через механизм сигналов и слотов.
Теоретические сведения
Основные виджеты Qt Widgets
| Класс | Назначение |
|---|---|
QWidget |
Базовый класс всех виджетов |
QMainWindow |
Главное окно приложения |
QPushButton |
Кнопка |
QLineEdit |
Однострочное текстовое поле |
QTextEdit |
Многострочное текстовое поле |
QLabel |
Текстовая метка |
QListWidget |
Список элементов |
QComboBox |
Выпадающий список |
QMenuBar / QMenu |
Меню |
QStatusBar |
Строка состояния |
QDialog |
Диалоговое окно |
Менеджеры компоновки
// Вертикальная компоновка
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(new QLabel("Сообщение:"));
layout->addWidget(textEdit);
layout->addWidget(sendButton);
// Горизонтальная компоновка
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->addWidget(inputLine);
hLayout->addWidget(sendButton);
// Вложенные компоновки
QVBoxLayout* mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(chatDisplay); // основной виджет
mainLayout->addLayout(hLayout); // вложенный горизонтальныйСигналы и слоты для виджетов
QAction и меню
// Создание меню
QMenuBar* menuBar = this->menuBar();
QMenu* fileMenu = menuBar->addMenu("Файл");
QAction* connectAction = fileMenu->addAction("Подключиться");
connect(connectAction, &QAction::triggered, this, &MainWindow::onConnect);
QAction* exitAction = fileMenu->addAction("Выход");
connect(exitAction, &QAction::triggered, this, &QWidget::close);Строка состояния
Конфигурация CMake
Задание для выполнения
Создать графический интерфейс мессенджера с использованием Qt Widgets. Интерфейс должен позволять подключаться к эхо-серверу (из лабораторной работы №7), отправлять и получать сообщения.
Требования к программе
Структура главного окна MainWindow (наследник QMainWindow):
Меню (
QMenuBar):- «Соединение» → «Подключиться…» (диалог ввода IP и порта), «Отключиться», разделитель, «Выход»
- «Журнал» → «Очистить», «Сохранить в файл…»
Центральная область — разделена на три части:
Левая панель — информация о подключении:
QLabel«Сервер:» +QLabelдля отображения IP:портаQLabel«Статус:» +QLabelдля отображения статуса (подключён/отключён)QLabel«Отправлено:» +QLabel(счётчик сообщений)QLabel«Получено:» +QLabel(счётчик сообщений)
Центральная панель — область чата:
QTextEdit(только для чтения,setReadOnly(true)) — отображение истории сообщений. Сообщения форматировать:[HH:MM:SS] >> текст отправленного сообщенияи[HH:MM:SS] << текст полученного сообщенияразными цветами (синий для отправленных, зелёный для полученных).
Нижняя панель — ввод и отправка:
QLineEdit— поле ввода сообщенияQPushButton«Отправить» — отправка сообщения (также срабатывает по нажатию Enter)
Строка состояния (
QStatusBar):- Индикатор подключения (текст + цвет)
Логика:
- Класс
MainWindowсодержитQTcpSocket*для сетевого взаимодействия:- «Подключиться…» — открыть
QDialogс полями ввода IP-адреса и порта, выполнитьconnectToHost() - «Отключиться» —
disconnectFromHost() - «Отправить» —
socket->write(), очистить поле ввода, обновить счётчик readyRead— прочитать данные, добавить в историю чата, обновить счётчик- «Очистить» — очистить
QTextEditистории - «Сохранить в файл…» —
QFileDialog::getSaveFileName(), запись истории в текстовый файл
- «Подключиться…» — открыть
- При отключении кнопка «Отправить» должна быть неактивна (
setEnabled(false)), при подключении — активна.
Примерный внешний вид
Индивидуальные задания
Каждый вариант представляет собой приложение QMainWindow с меню (QMenuBar), центральной областью с виджетами ввода/отображения, строкой состояния (QStatusBar) и подключением к TCP-серверу через QTcpSocket.
Вариант 1. Клиент сетевого калькулятора
GUI: QLineEdit для первого операнда, QComboBox для операции (+, -, *, /, √, ^), QLineEdit для второго операнда (скрывается для унарных), QPushButton «Вычислить», QLineEdit для результата (только чтение), QTextEdit для истории вычислений. Левая панель: QLabel с сервером (IP:порт), QLabel статуса подключения, QLabel счётчиков (отправлено/получено). Меню: «Соединение» (Подключиться…, Отключиться, Выход), «История» (Очистить, Сохранить в файл…). Кнопка “Вычислить” неактивна при отключении. Подключение к серверу калькулятора (CALC/SQRT/POW протокол из ЛР7). Формат истории: [HH:MM:SS] 15 + 7 = 22 (синий), [HH:MM:SS] ERROR: деление на ноль (красный).
Вариант 2. Мессенджер
Интерфейс мессенджера описан в разделе «Задание для выполнения»: три панели (информация о подключении, область чата, панель ввода), подключение к эхо-серверу из ЛР7.
Меню: «Соединение» → «Подключиться…», «Отключиться», «Выход»; «Журнал» → «Очистить», «Сохранить в файл…».
Вариант 3. Клиент справочника DNS
GUI: QLineEdit для ввода доменного имени, QPushButton «Найти», QLineEdit для отображения IP-адреса (результат), QTextEdit для истории запросов, QListWidget для списка всех записей справочника.
Меню: «Соединение» → «Подключиться», «Отключиться»; «Записи» → «Обновить», «Добавить…».
Сервер: DNSServer. Запрос: доменное имя. Ответ: IP-адрес.
Вариант 4. Клиент погоды
GUI: QComboBox для выбора города, QLabel для отображения температуры, влажности и скорости ветра, QPushButton «Обновить», QTextEdit для истории запросов.
Меню: «Соединение» → «Подключиться», «Отключиться»; «Города» → «Обновить список».
Сервер: WeatherServer. Запрос: название города. Ответ: температура, влажность, ветер.
Вариант 5. Клиент конвертера валют
GUI: QDoubleSpinBox для ввода суммы, два QComboBox для исходной и целевой валюты, QLabel для результата конвертации, QPushButton «Конвертировать», QTextEdit для истории операций.
Меню: «Соединение» → «Подключиться», «Отключиться»; «Курс» → «Показать курс».
Сервер: CurrencyServer. Запрос: сумма, исходная валюта, целевая валюта. Ответ: сконвертированная сумма.
Вариант 6. Клиент TO-DO списка
GUI: QLineEdit для ввода задачи, QPushButton «Добавить», QListWidget для списка задач (с чекбоксами), QPushButton «Выполнить» / «Удалить».
Меню: «Соединение» → «Подключиться», «Отключиться»; «Список» → «Очистить», «Обновить».
Сервер: TodoServer. Запрос: команда (добавить/выполнить/удалить/показать), задача. Ответ: обновлённый список задач.
Вариант 7. Клиент телефонного справочника
GUI: QLineEdit для имени, QLineEdit для телефона, QPushButton «Добавить» / «Найти» / «Удалить», QListWidget для отображения всех записей справочника.
Меню: «Соединение» → «Подключиться», «Отключиться»; «Записи» → «Показать все».
Сервер: PhoneServer. Запрос: команда (добавить/найти/удалить/все), имя, телефон. Ответ: результат операции.
Вариант 8. Клиент хранилища KV (ключ—значение)
GUI: QLineEdit для ключа, QLineEdit для значения, QPushButton «Сохранить» / «Получить» / «Удалить», QListWidget для списка ключей, QLineEdit для отображения полученного значения.
Меню: «Соединение» → «Подключиться», «Отключиться»; «Данные» → «Ключи», «Очистить».
Сервер: KVServer. Запрос: команда (set/get/del/keys), ключ, значение. Ответ: значение или список ключей.
Вариант 9. Клиент генератора паролей
GUI: QSpinBox для длины пароля, QComboBox для типа символов (alpha / num / all), QPushButton «Сгенерировать», QLineEdit для результата (только чтение), QTextEdit для истории сгенерированных паролей.
Меню: «Соединение» → «Подключиться», «Отключиться»; «История» → «Очистить», «Сохранить».
Сервер: PassServer. Запрос: длина, тип. Ответ: сгенерированный пароль.
Вариант 10. Клиент конвертера систем счисления
GUI: QLineEdit для ввода числа, QPushButton «BIN» / «OCT» / «HEX», QLineEdit для результата (только чтение), QTextEdit для истории преобразований.
Меню: «Соединение» → «Подключиться», «Отключиться»; «История» → «Очистить».
Сервер: ConvServer. Запрос: число, целевая система счисления. Ответ: число в новой системе счисления.
Вариант 11. Клиент файлового менеджера (имитация)
GUI: QListWidget для списка файлов на сервере, QLineEdit для имени файла, QPushButton «Создать» / «Удалить» / «Размер», QLabel для информации о файле (имя, размер, дата).
Меню: «Соединение» → «Подключиться», «Отключиться»; «Файлы» → «Обновить».
Сервер: FileServer. Запрос: команда (создать/удалить/размер/список), имя файла. Ответ: результат операции.
Вариант 12. Клиент голосования
GUI: четыре QRadioButton для вариантов ответа, QPushButton «Голосовать», QProgressBar для отображения результатов по каждому варианту, QLabel для статуса (голос принят / уже голосовали).
Меню: «Соединение» → «Подключиться», «Отключиться»; «Результаты» → «Обновить».
Сервер: VoteServer. Запрос: номер варианта. Ответ: текущие результаты голосования.
Вариант 13. Клиент системы логирования
GUI: QComboBox для выбора уровня (INFO / WARN / ERROR), QLineEdit для ввода сообщения, QPushButton «Записать», QTextEdit для отображения содержимого журнала, QPushButton «Обновить» / «Очистить».
Меню: «Соединение» → «Подключиться», «Отключиться»; «Журнал» → «Обновить», «Очистить», «Сохранить».
Сервер: LogServer. Запрос: команда (записать/показать), уровень, сообщение. Ответ: содержимое журнала.
Вариант 14. Клиент чата (многоклиентский)
GUI: QTextEdit для истории сообщений (отправленные и полученные от других клиентов), QLineEdit для ввода сообщения, QPushButton «Отправить», QListWidget для списка подключённых пользователей, QLineEdit для ввода имени пользователя (при подключении).
Меню: «Соединение» → «Подключиться с именем…», «Отключиться»; «Журнал» → «Очистить».
Сервер: ChatServer (многоклиентский). Запрос: имя пользователя, сообщение. Ответ: рассылка сообщений всем подключённым клиентам.
Вариант 15. Клиент системного монитора
GUI: QLabel для отображения имени хоста, ОС, количества процессоров и объёма памяти, QLCDNumber для аптайма (время работы), QPushButton «Обновить» / «Ping».
Меню: «Соединение» → «Подключиться», «Отключиться»; «Обновить» → «Обновить данные».
Сервер: InfoServer. Запрос: команда (info/uptime/ping). Ответ: системная информация.
Вариант 16. Клиент генератора случайных чисел
GUI: два QSpinBox для min и max, QPushButton «Сгенерировать», QLabel для отображения результата, QTextEdit для истории сгенерированных чисел.
Меню: «Соединение» → «Подключиться», «Отключиться»; «История» → «Очистить».
Сервер: RandServer. Запрос: min, max. Ответ: случайное число.
Вариант 17. Клиент статистики текста
GUI: QTextEdit для ввода текста, QPushButton «Анализировать», QLabel для отображения количества символов, слов и строк.
Меню: «Соединение» → «Подключиться», «Отключиться».
Сервер: StatServer. Запрос: текст. Ответ: количество символов, слов, строк.
Вариант 18. Клиент трансформации текста
GUI: QLineEdit для ввода текста, QPushButton «REVERSE» / «UPPER» / «LOWER», QLineEdit для результата (только чтение), QTextEdit для истории преобразований.
Меню: «Соединение» → «Подключиться», «Отключиться»; «История» → «Очистить».
Сервер: TextServer. Запрос: команда (reverse/upper/lower), текст. Ответ: преобразованный текст.
Вариант 19. Клиент анаграмм
GUI: QLineEdit для ввода слова, QPushButton «Найти анаграммы», QListWidget для отображения найденных анаграмм.
Меню: «Соединение» → «Подключиться», «Отключиться».
Сервер: AnagramServer. Запрос: слово. Ответ: список анаграмм.
Вариант 20. Клиент сервера времени
GUI: QLCDNumber для отображения текущего времени, QPushButton «Обновить», QLabel для отображения текущей даты.
Меню: «Соединение» → «Подключиться», «Отключиться»; «Формат» → «12-часовой», «24-часовой».
Сервер: TimeServer. Запрос: команда (time/date). Ответ: текущее время или дата.
Порядок выполнения
- Создать проект Qt Widgets Application в Qt Creator (CMake).
- В конструкторе
MainWindowсоздать все виджеты и менеджеры компоновки программно (или через Qt Designer — по выбору). - Реализовать меню с помощью
QMenuBar,QMenu,QAction. - Реализовать подключение к серверу через диалоговое окно.
- Реализовать отправку и приём сообщений через
QTcpSocketи сигналы/слоты. - Реализовать форматирование сообщений в истории чата (цвета, временные метки).
- Реализовать сохранение журнала в файл.
- Запустить эхо-сервер из лабораторной работы №7, подключиться клиентом, протестировать обмен сообщениями.
- Сохранить скриншоты.
Контрольные вопросы
- Какие виджеты Qt использованы в программе? Каково назначение каждого?
- Чем отличается
QLineEditотQTextEdit? Когда следует использовать каждый из них? - Какие менеджеры компоновки существуют в Qt? В чём преимущества менеджеров компоновки перед ручным позиционированием?
- Что такое
QActionи как он связан с меню и панелью инструментов? - Как работает механизм сигналов и слотов? Чем отличается
clicked()отtriggered()? - Как сделать виджет доступным или недоступным для взаимодействия?
- Как вызвать стандартный диалог выбора файла (
QFileDialog)? - Как изменить цвет текста в
QTextEdit? Какие классы используются для форматирования? - Что такое
QDialogи чем он отличается отQMainWindow?
Содержание отчёта
- Тема, цель и задание лабораторной работы.
- Скриншоты внешнего вида приложения (подключение, обмен сообщениями, отключение).
- Текст программы с комментариями.
- Скриншот сохранённого файла журнала.
- Ответы на контрольные вопросы.
