QT-串口工具

一、演示效果

请添加图片描述

二、关键程序

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QMessageBox>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),listPlugins(QList<TabPluginInterface *>()),translator(new QTranslator())
{ui->setupUi(this);tabCOMSimple = new TabCOMSimple(this);ui->tabMain->addTab(tabCOMSimple, tr("Simple"));tabAdvanced = new TabAdvanced(this);ui->tabMain->addTab(tabAdvanced, tr("Advanced"));decoder = new Decoder(this, tabAdvanced->getListProtocals(), tabAdvanced->getEndianess());// [start] Data stream connections.connect(decoder, &Decoder::rawDataReady, tabCOMSimple, &TabCOMSimple::rawDataReady);connect(decoder, &Decoder::frameReady, tabAdvanced, &TabAdvanced::frameDataReady);// [End]// [Start] Pluginsconnect(ui->actionLoad_Plugin, &QAction::triggered, this, &MainWindow::onLoadPluginTriggered);connect(decoder, &Decoder::frameReady, this, &MainWindow::onDecodedDataReady);QString folderString = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/QSerial Socket Amigo";QFileInfo folder(folderString);if (!folder.exists())QDir().mkdir(folderString);folderString.append("/plugins");QFileInfo pluginsFolder(folderString);if (!pluginsFolder.exists())QDir().mkdir(folderString);// [End]// [Start] i18nconnect(ui->actionEnglish, &QAction::triggered, this, &MainWindow::onActionEnglishTriggered);ui->menuLanguage->addAction(tr(u8"简体中文"), this, &MainWindow::onActionChineseTriggered);// [End]ui->groupNetProperties->setDisabled(true);connect(ui->radioSerial, &QRadioButton::clicked, this, &MainWindow::onConnectionTypeChanged);connect(ui->radioNetSocket, &QRadioButton::clicked, this, &MainWindow::onConnectionTypeChanged);connect(ui->buttonOpen, &QPushButton::clicked, this, &MainWindow::openConnection);serialDevice = new SerialDevice(this, ui->comboPorts, ui->buttonRefreshPorts,ui->comboBaudrate, ui->comboDataBits,ui->comboParity, ui->comboStopBits,ui->comboFlowControl);netSocketDevice = new NetSocketDevice(this, ui->inputNetIPAddr, ui->inputNetPort,ui->radioNetTypeTCP, ui->radioNetTypeUDP,ui->radioNetRoleClient, ui->radioNetRoleServer);connect(serialDevice, &SerialDevice::connected, this, &MainWindow::onDeviceConnected);connect(netSocketDevice, &SerialDevice::connected, this, &MainWindow::onDeviceConnected);connect(serialDevice, &SerialDevice::errorDisconnected, this, &MainWindow::onDeviceErrorDisconnected);connect(netSocketDevice, &SerialDevice::errorDisconnected, this, &MainWindow::onDeviceErrorDisconnected);commDevice = serialDevice;// [start] Log stream connections.connect(tabCOMSimple, &TabCOMSimple::log, this, &MainWindow::log);connect(netSocketDevice, &NetSocketDevice::log, this, &MainWindow::log);// [end]translateTo("zh");this->setWindowTitle(u8"串口工具");
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::onConnectionTypeChanged(bool isChecked)
{Q_UNUSED(isChecked)if (ui->radioSerial->isChecked()) {ui->groupNetProperties->setDisabled(true);ui->groupSerialProperties->setEnabled(true);commDevice = serialDevice;} else if (ui->radioNetSocket->isChecked()) {ui->groupNetProperties->setEnabled(true);ui->groupSerialProperties->setDisabled(true);commDevice = netSocketDevice;}
}void MainWindow::closeDevice()
{commDevice->close();ui->groupConnSel->setEnabled(true);ui->buttonOpen->setText(tr("Open Connection"));tabAdvanced->setAllowRunning(false);
}void MainWindow::openConnection()
{if (ui->groupConnSel->isEnabled()) {// This acts like sending connect command, device will signals conncted if so.int ret = commDevice->open();if (ret != 0) {return;}} else {closeDevice();}
}// Only when device is really connected.
void MainWindow::onDeviceConnected()
{tabCOMSimple->bindIODevice(commDevice->ioDevice);decoder->setConnection(commDevice->ioDevice);ui->groupConnSel->setDisabled(true);ui->buttonOpen->setText(tr("Close Connection"));tabAdvanced->setAllowRunning(true);
}void MainWindow::onDeviceErrorDisconnected()
{closeDevice();
}void MainWindow::log(QString str)
{ui->textLog->append(str);
}void MainWindow::onLoadPluginTriggered()
{QString pluginsFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/QSerial Socket Amigo/plugins";
#if defined(Q_OS_WIN)QString type = tr("Dynamic Linked Library (*.dll)");
#elif defined (Q_OS_LINUX)QString type = tr("Shared Library (*.so)");
#else//Not supporting Mac.Q_ASSERT(false);
#endifQString fileName = QFileDialog::getOpenFileName(this,tr("Select Plugin to Load"),pluginsFolder,type);if (fileName.isEmpty())return;else {QPluginLoader loader(fileName);QObject *pluginObject = loader.instance();if (pluginObject) {TabPluginInterface *plugin = qobject_cast<TabPluginInterface *>(pluginObject);plugin->setConnection(currentConnection);listPlugins.append(plugin);QWidget *widget = new QWidget();widget->setLayout(plugin->getLayout());ui->tabMain->addTab(widget, plugin->getName());ui->tabMain->setCurrentIndex(ui->tabMain->count() - 1);} elseQMessageBox::warning(this, tr("error"), tr("plugin read error"));}
}void MainWindow::onDecodedDataReady(int id, QList<double> listValues)
{for (auto plugin : listPlugins)plugin->onFrameUpdated(id, listValues);
}// Two characters locale, eg: en, zh, de.
void MainWindow::translateTo(QString locale)
{QString qmPath = qApp->applicationDirPath().append("/Serial-Amigo_");translator->load(qmPath.append(locale).append(".qm"));qApp->installTranslator(translator);}void MainWindow::retranslateUi()
{ui->tabMain->setTabText(1, QCoreApplication::translate("MainWindow", "Simple"));ui->tabMain->setTabText(2, QCoreApplication::translate("MainWindow", "Advanced"));ui->comboParity->setItemText(0, QCoreApplication::translate("MainWindow", "NoParity"));ui->comboParity->setItemText(1, QCoreApplication::translate("MainWindow", "EvenParity"));ui->comboParity->setItemText(2, QCoreApplication::translate("MainWindow", "OldParity"));ui->comboParity->setItemText(3, QCoreApplication::translate("MainWindow", "SpaceParity"));ui->comboParity->setItemText(4, QCoreApplication::translate("MainWindow", "MarkParity"));ui->comboFlowControl->setItemText(0, QCoreApplication::translate("MainWindow", "No"));ui->comboFlowControl->setItemText(1, QCoreApplication::translate("MainWindow", "Hard"));ui->comboFlowControl->setItemText(2, QCoreApplication::translate("MainWindow", "Soft"));
}void MainWindow::onActionChineseTriggered()
{translateTo("zh");
}void MainWindow::onActionEnglishTriggered()
{translateTo("en");
}void MainWindow::changeEvent(QEvent *event)
{switch (event->type()) {case QEvent::LanguageChange:ui->retranslateUi(this);retranslateUi();break;default:break;}QMainWindow::changeEvent(event);
}void MainWindow::updatePluginConnection()
{for (auto plugin : listPlugins)plugin->setConnection(commDevice->ioDevice);
}

三、下载链接

https://download.csdn.net/download/u013083044/88867720

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/262641.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript字符串的常用方法(非常详细)

文章目录 一、操作方法增concat 删改trim()、trimLeft()、trimRight()repeat()padEnd() toLowerCase()、 toUpperCase()查charAt()indexOf()startWith()、includes() 二、转换方法split 三、模板匹配方法match()search()replace() 一、操作方法 我们也可将字符串常用的操作方法…

zemax凯尔纳目镜

也叫做凯涅尔目镜 凯尔纳目镜 是由单片透镜和双胶合透镜组成的。 一种改进型的冉斯登目镜&#xff0c;二片组成的接目镜及双凸透镜作为场镜。 它能校正倍率色差 &#xff0c;同时也减小了位置色差 、像散和畸变。 视场角大于40&#xff0c;可达50。 目前在一些中低倍望远镜中…

在Linux操作系统的ECS实例上安装Hive

目录 1. 完成hadoop安装配置2. 安装配置MySql安装配置 3. 安装Hive4. 配置元数据到MySQL5. hiveserver2服务配置文件测试 1. 完成hadoop安装配置 在Linux操作系统的ECS实例上安装hadoop 以上已安装并配置完jdk、hadoop也搭建了伪分布集群 2. 安装配置MySql 安装 下下一步…

Jenkins使用遇到的一些问题

一&#xff1a;插件依赖报错 比如遇到一堆插件报错&#xff0c;不是提示版本对不上&#xff0c;就是启用不了 这样直接把Jenkins升级就行了&#xff0c;比如我这个是命令行启动的&#xff0c;直接把他替换就好了 如果是遇到插件依赖报错&#xff0c;比如A插件异常 则点击这个插…

RISC-V知识总结 —— 指令集

资源1: RISC-V China – RISC-V International 资源2: RISC-V International – RISC-V: The Open Standard RISC Instruction Set Architecture 资源3: RV32I, RV64I Instructions — riscv-isa-pages documentation 1. 指令集架构的类型 在讨论RISC-V或任何处理器架构时&…

解决IDEA中Maven下载依赖包过慢或报错的问题

由于公司项目迭代&#xff0c;越来越多的项目开始转型新版本&#xff0c;由于我对Java一直不感冒&#xff0c;但要顺应公司项目要求&#xff0c;遂自己要逐步开始完善Java相关的知识层面&#xff0c;此篇是我在学习SpringBoot时对一些不懂地方及遇到问题时的记录。 学习视频链…

[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的耕地占补平衡报备格式&#xff0c;现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见&#xff1a;软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&#xff08;插件&#xff09;&#xff0c;需要授权后才能使用&#xff1b; 本软件…

fpga_cpu加速

一 cpu流水线执行指令 二 计算机体系结构 注&#xff1a;ARM就是典型的哈佛结构 三 cpu加速 同样采用流水线&#xff0c;哈佛结构的指令效率更高&#xff0c;通过指令预取&#xff0c;提高了流水线的并行度。

Java学习笔记2024/2/19

2.11 金额转换 2.11.1 案例需求 把2135变成&#xff1a;零佰零拾零万贰仟壹佰叁拾伍元 把789变成&#xff1a;零佰零拾零万零仟柒佰捌拾玖元 2.11.2 代码实现 package com.itheima.stringdemo; ​ import java.util.Scanner; ​ public class StringDemo9 {public static …

Java向ES库中插入数据报错:I/O reactor status: STOPPED

Java向ES库中插入数据报错&#xff1a;java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STO 一、问题问题原因 二、解决思路 一、问题 在使用Java向ES库中插入数据时&#xff0c;第一次成功插入&#xff0c;第二次出现以下错误&#xff1a…

第九节HarmonyOS 常用基础组件27-Rating

1、描述 提供在给定范围内选择评分的组件。 2、接口 Rating(options?:{rating:number, indicator?:boolean}) 3、参数 参数名 参数类型 必填 描述 rating number 是 设置并接收评分值。默认值&#xff1a;0&#xff1b;取值范围[0, stars]&#xff0c;小于0取0&am…

.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2

前言 很多同学都不愿给电脑设动态壁纸&#xff0c;其中有个重要原因就是嫌它占资源过多。今天大姚分享一个.NET开源、免费&#xff08;MIT license&#xff09;的一个小而快并且功能强大的 Windows 动态桌面软件&#xff0c;支持视频和网页动画播放&#xff1a;DreamScene2。 …

自学Python第十八天-自动化测试框架(二):DrissionPage、appium

自学Python第十八天-自动化测试框架&#xff08;二&#xff09;&#xff1a;DrissionPage、appium DrissionPage环境和安装配置准备工作简单的使用示例控制浏览器收发数据包模式切换 浏览器模式创建浏览器对象访问页面加载模式none 模式技巧 获取页面信息页面交互查找元素ele()…

knife4j springboot3使用

简介 在日常开发中&#xff0c;写接口文档是我们必不可少的&#xff0c;而Knife4j就是一个接口文档工具&#xff0c;可以看作是Swagger的升级版&#xff0c;但是界面比Swagger更好看&#xff0c;功能更丰富 使用 我使用的是springboot3.2.3 knife4j 4.3.0,knife4j 4.4版本有…

HarmonyOS学习--三方库

文章目录 一、三方库获取二、常用的三方库1. UI库&#xff1a;2. 网络库&#xff1a;3. 动画库&#xff1a; 三、使用开源三方库1. 安装与卸载2. 使用 四、问题解决1. zsh: command not found: ohpm 一、三方库获取 在Gitee网站中获取 搜索OpenHarmony-TPC仓库&#xff0c;在t…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四 01.解数独02.单词搜索03.黄金矿工04.不同路径 III 01.解数独 题目链接&#xff1a;https://leetcode.cn/problems/sudoku-solver/ 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&am…

个人博客系统测试

文章目录 一、项目介绍二、测试1. 功能测试2. 自动化测试&#xff08;1&#xff09;添加相关依赖&#xff08;2&#xff09;新建包并在报下创建测试类&#xff08;3&#xff09;亮点及难点 一、项目介绍 个人博客系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来…

Stable Diffusion 3的到来巩固了 AI 图像对抗 Sora 和 Gemini 的早期领先优势

Stability AI 将其更改为 Stable Diffusion 3。VentureBeat 报道称&#xff0c;Stability AI 的下一代旗舰 AI 图像生成模型将使用类似于 OpenAI 的 Sora 的扩散变压器框架。其当前模型仅依赖于扩散架构。虽然尚未发布&#xff0c;但您可以在等候名单中注册。 官方网址链接&am…

<Linux> 可重入函数 volatile关键字 以及SICHLD信号

目录 一、可重入函数 &#xff08;一&#xff09;引入 &#xff08;二&#xff09;可重入函数的判断 二、volatile关键字 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;关于编译器的优化的简单讨论 三、SIGCHLD信号 一、可重入函数 &#xff08;一&#…

CSS 面试题汇总

CSS 面试题汇总 1. 介绍下 BFC 及其应 参考答案&#xff1a; 参考答案&#xff1a; 所谓 BFC&#xff0c;指的是一个独立的布局环境&#xff0c;BFC 内部的元素布局与外部互不影响。 触发 BFC 的方式有很多&#xff0c;常见的有&#xff1a; 设置浮动overflow 设置为 auto、scr…