Программа для com-порта
Запись от Uhbif79 размещена 05.06.2026 в 20:59
Показов 2806
Комментарии 2
|
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на С. В качестве первого задания решил сделать программу которая позволяла бы отправлять и принимать данные в/из com-порта. Изначально писал ее в ОС Astra Linux, поэтому видел ее практическое применение в том, чтобы можно было сканировать порты, находить подключенные переходники USB-COM выставлять скорость и далее пользователь мог работать с тем или иным оборудованием, которое управляется по последовательному порту. То есть моя программа избавляла бы пользователя от знания терминальных программ по настройке Com-порта в Linux. Хотя предполагаю что для Linux есть программы, которые позволяют управлять com-портом в графическом режиме (Cutecom, Putty и прочее). Смысл моей программы свелся чисто к изучению возможностей Qt, я добавил отрисовку круга, в зависимости от успешности или неуспешности подключения, сопроводил действия звуком, вставил текстовую описательную часть и так далее. Здесь я прикрепляю свою программу в заархивированном виде. Возможно она пригодится таким начинающим как я или я получу отзывы и предложения по ее усовершенствованию. Все что хотел я реализовать у меня получилось, единственное я так до конца не разобрался с сохранением параметров com-порта после выхода из программы (на ОС Astra Linux). Я применил метод setSettingsRestoredOnClose(false) - он в принципе рабочий но дает задержку около 2 секунд. Пробовал замаскировать это запуском Progress-бара, стало получше, но не получилось это сделать параллельно. Решил на этом пока закончить. |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
-
Обрезка требуемого уровня звука
Вы используете Qt 5. У вас есть вызов командыsetVolume(150), но setVolume метод принимает значения в процентах от 0 до 100:
Цитата из документации:
Перевод:
Значение будет урезано до 100.
Портирование на Qt 6
Портировал ваш пример с Qt5 на Qt 6.11.1: com-port.zip
Форматирование кода
Код отформатировал с помощью консольной утилиты clang-format: Консольные команды для форматирования исходного кода
Утечка памяти
При каждом клике создаётся тяжёлый объект классаQMediaPlayer. Я добавил вызовdeleteLater(), чтобы не было утечки памяти, а воспроизведение звука убрал в отдельный метод:
Уменьшение количества инклудовC++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
// Передаем volume от 0 до 100 void MainWindow::playSound(const QString &filePath, int volumePercent) { if (ui->checkBox->isChecked()) return; QMediaPlayer *player = new QMediaPlayer(this); QAudioOutput *audioOutput = new QAudioOutput(this); player->setAudioOutput(audioOutput); player->setSource(QUrl::fromLocalFile(filePath)); // Преобразуем 0-100 в 0.0-1.0 float volume = static_cast<float>(volumePercent) / 100.0f; audioOutput->setVolume(volume); player->play(); // Удаляем плеер после завершения воспроизведения, чтобы не было утечки памяти connect(player, &QMediaPlayer::playbackStateChanged, this, [player, audioOutput](QMediaPlayer::PlaybackState state) { if (state == QMediaPlayer::StoppedState) { player->deleteLater(); audioOutput->deleteLater(); } }); }
Сократил количество инклудов до этого числа:
Портирование на CMakeC++ 1 2 3 4 5 6 7 8 9 10 11
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QAudioOutput> #include <QDebug> #include <QMediaPlayer> #include <QMessageBox> #include <QPainter> #include <QSerialPortInfo> #include <QThread> #include <QTimer> #include <QtSerialPort/QSerialPort>
Заменил QMake на CMake. Добавил файлCMakeListst.txt:
Вы можете открыть проект из Qt Creator, выбравCode 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
cmake_minimum_required(VERSION 3.21) project(Com LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Find the Qt6 package and required components find_package(Qt6 REQUIRED COMPONENTS Core Gui Multimedia SerialPort Widgets ) # Automatically handle UI files and resources set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) # Add your source and header files add_executable(Com main.cpp mainwindow.cpp mainwindow.h mainwindow.ui resource.qrc ) # Link the libraries target_link_libraries(Com PRIVATE Qt6::Core Qt6::Gui Qt6::Multimedia Qt6::SerialPort Qt6::Widgets ) # Deployment rule (equivalent to your INSTALLS logic) install(TARGETS Com RUNTIME DESTINATION bin )
File>Open File or Project...и выбратьCMakeListst.txt. Это так же как открыть проект .pro, но вместо .pro открытьCMakeListst.txtЗапись от 8Observer8 размещена 06.06.2026 в 19:24
Обновил(-а) 8Observer8 15.08.2026 в 15:59 -
На всякий случай напишу, что это не я занижал оценку - я ставил 5 звёзд. А выглядит так, будто я раскритиковал код и влепил низкую оценку. Проект отлично сделан!
Лучше переделайте его на Qt6, потому что Qt5 сейчас мало кто использует. На Qt6 большинство сможет сразу скачивать и запускать ваши примеры. Сейчас большинство программистов в мире используют CMake, поэтому лучше сразу создавать проекты типа CMake в Qt Creator, а не QMake.
Правильно, что вы практикуетесь, создавая такие замечательные примеры. Желаю вам стабильной мотивации и радости от программирования на C++!Запись от 8Observer8 размещена 15.08.2026 в 16:31


