从零开始实现自己的串口调试助手(4) -实现自动发送 / 时间显示

实现自动发送:checkBox

添加bool槽函数

bool 值,当√的时候为true

取消√ 位false

实现带bool 类型的槽函数:

void Widget::on_checkBox_SendInTime_clicked(bool checked)
{
    qDebug()<<"checkStatus:"<<checked;
    if(checked){ // 被勾选了
    //发送一次
    //on_btnSendContext_clicked();
    timer->start(ui->lineEdit_TimeEach->text().toInt()); // 读取框内的内容,更新发生频率
    // 发生的时候这两选择不能被修改
    ui->lineEdit_TimeEach->setEnabled(false);
    ui->lineEdit_SendContext->setEnabled(false);
    }
    else{// √取消就不发送
    timer->stop();
    ui->lineEdit_TimeEach->setEnabled(true);
    ui->lineEdit_SendContext->setEnabled(true);
    }
}


关联信号与槽: 定时器的使用

头文件定义:

 QTimer *timer;

构造函数初始化

timer  = new QTimer(this);
    // 关联信号与槽 --每次到点就发送一次
    connect(timer,&QTimer::timeout,[=](){
    on_btnSendContext_clicked();

    });

checkBox优化:


当关闭串口的时候的时候:
把√取消掉
并且关闭定时器
重新设置控件的是否可选


  ui->checkBox_SendInTime->setCheckState(Qt::Unchecked);
  timer->stop();
  ui->lineEdit_TimeEach->setEnabled(false);
  ui->lineEdit_SendContext->setEnabled(true);

效果演示

解决遗留历史记录bug:

bug 描述: 当发送的字符串过于长的时候我们的历史记录有可能重复记录相同的字符串

我们只需要修改他的编码类型即可

解决方法: 换一种方式装换为 const char * 类型

还添加了显示Receive/send的优化

效果演示

==================================

实现清除接收 和 保存接收

清除接收

槽函数

void Widget::on_btnRevClear_clicked()
{
    ui->textEditRev->setText(""); // 实现清空接收
}

效果演示:

清空前  -->  清空后

保存接收:

槽函数

void Widget::on_btnRevSave_clicked()
{
     //为了save去打开
    QString fileName = QFileDialog::getSaveFileName(this, tr("Open File"),
                                                    "F:/myqt/file_of_qt/serialData.txt",
                                                    tr("Text (*.txt)"));
    if(fileName != NULL){
        QFile file(fileName);
           if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
               return;

           QTextStream out(&file);
           out << ui->textEditRev->toPlainText();
           file.close();
    }
}

效果演示

QDataTime 获得当前系统时间

getSysTime()获得当前时间


先通过QDataTime 获取当前系统的日期和时间,再拼接获得当前时间

void Widget::getSysTime() // 构建我们当前的日期和时间
{

 QDateTime currentTime = QDateTime::currentDateTime(); // 获得当前日期
 // 获取日期
 QDate date  = currentTime.date();
 int year = date.year();
 int month = date.month();
 int day = date.day();
 //获取时间
 QTime time = currentTime.time();
 int hour = time.hour();
 int minute = time.minute();
 int second = time.second();
//QString 字符串拼接出我们需要的格式

  myTime = QString("%1-%2-%3  %4:%5:%6")
         .arg(year).arg(month).arg(day).arg(hour).arg(minute).arg(second);

}

刷新显示当前时间

再使用定时器去刷新时间

  定时器 加信号与槽 刷新时间


    QTimer * getSysTimeTimer = new QTimer(this);
    connect(getSysTimeTimer,SIGNAL(timeout()),this,SLOT(time_reflash));
    getSysTimeTimer->start(100); // 100ms 刷新一次时间

实现槽函数:

void Widget::time_reflash()
{
    //刷新一下当前系统时间  到 myTime中
    getSysTime();
    //将得到的时间再标签中显示
    ui->label_CurrentTime->setText(myTime);
}

效果演示

显示优化

设置参数指定大小

// 2 - 位宽 10 -- 基数,10进制 QChar('0')  -- 结束字符串 \0  -- 0尾巴
  myTime = QString("%1-%2-%3   %4:%5:%6")
         .arg(year,2,10,QChar('0'))
          .arg(month,2,10,QChar('0'))
          .arg(day,2,10,QChar('0'))
          .arg(hour,2,10,QChar('0'))
          .arg(minute,2,10,QChar('0'))
          .arg(second,2,10,QChar('0'));


接收到的消息显示当前时间:

思路:

设置一个flag去获取 下图中接收时间的 √选状态  -- bool 类型槽函数 -- 直接通过checked 去判断

再发送的时候判断一下这个flag,勾选状态的话就需要额外拼接一个字符串来输出到接收框内了

槽函数

void Widget::on_checkBox_RevTime_clicked(bool checked)
{
    if(checked){ //读取当前的系统时间

        sendTimeStatus = true;
    }
    else{
        sendTimeStatus = false;
    }

}

修改后的接收函数


void Widget::on_SerialData_readToRead()
{
    QString recvMessage = serialPort->readAll();
    if(recvMessage != NULL){
        qDebug()<<"get Message: "<<recvMessage;
        if(sendTimeStatus){
            //更新myTime
            getSysTime();

            // 在myTime两边添加方括号
            QString myTimeWithBrackets = "【" + myTime + "】";

            // 创建一个QString对象,首先添加带方括号的myTime,然后添加sendData
            QString result = myTimeWithBrackets + QString(recvMessage);
            qDebug()<<result;
            ui->textEditRev->append(result);

        }
        else{
            ui->textEditRev->append(recvMessage);
        }
        readCntTotal += recvMessage.size();
        qDebug()<<"readCnt"<<recvMessage.size();
        //ui->label_RecvCnt->setNum(readCntTotal);
        ui->label_RecvCnt->setText("Receive:"+QString::number(writeCntTotal));
    }
}

实现效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python语言进阶学习

目录 一、类、对象和成员方法 二、构造方法 三、面向对象 &#xff08;1&#xff09;封装 &#xff08;2&#xff09;继承 单继承 多继承 复写 super&#xff1a;调用父类同名成员 &#xff08;3&#xff09;多态 &#xff08;4&#xff09;抽象类 五、Python操作…

Leecode---技巧---只出现一次的数字 / 多数元素

题解&#xff1a; 利用异或运算 a⊕a 0 的性质&#xff0c;可用来消除所有出现了两次的元素&#xff0c;最后剩余的即为所得。 class Solution { public:int singleNumber(vector<int>& nums){// 初始化为0int ans 0;for(int x: nums){// 异或操作ans ^ x;}retur…

Java循环结构while

1.while 是最基本的循环&#xff0c;它的结构为 while&#xff08;布尔表达式&#xff09;{ //循环内容 } 2.只要布尔表达式为true&#xff0c;循环就会一直执行下去 3.我们大多数情况是会让循环停止下来的&#xff0c;我们需要一个让表达式时效的方式来结束…

05C零碎语法

C零碎语法 目录 文章目录 C零碎语法1.函数指针2.回调函数3.数据拷贝3.1静态内存分配![请添加图片描述](https://img-blog.csdnimg.cn/direct/54d44e32bb7944f0866d4ca1e2667ce8.png)### 4.1动态内存分配 字符串6.sizeof()和strlen()的区别7.strcpy()/strncpy()函数7.1**strcp…

重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程)

重生之 SpringBoot3 入门保姆级学习&#xff08;16、函数式 Web 编程&#xff09; 3.4 函数式 Web 3.4 函数式 Web 个人写过 go 类似于 go gin 框架 1、场景 场景: User RESTful - CRUD GET/user/1 获取1号用户GET/users 获取所有用户POST/user 清求体携带JSON&#xff0c;新…

【Tlias智能学习辅助系统】04 部门管理 删除 和 新增

Tlias智能学习辅助系统 04 部门管理 删除 和 新增 删除部门APIDeptController.javaDeptService.javaDeptServiceImpl.javaDeptMapper.java前端联调 新增部门API有一步简化DeptController.javaDeptService.javaDeptServiceImpl.javaDeptMapper.java前端联调 删除部门API 请求路径…

友善RK3399v2平台利用rkmpp实现硬件编解码加速

测试VPU 编译mpp sudo apt update sudo apt install gcc g cmake make cd ~ git clone https://github.com/rockchip-linux/mpp.git cd mpp/build/linux/aarch64/ sed -i s/aarch64-linux-gnu-gcc/gcc/g ./arm.linux.cross.cmake sed -i s/aarch64-linux-gnu-g/g/g ./arm.lin…

6月2号总结

刷题记录Codeforces Round 925 &#xff08;A,B,C&#xff09; 1.A. Recovering a Small String 问题 - A - Codeforces 输入&#xff1a; 5 24 70 3 55 48 输出&#xff1a; aav rzz aaa czz auz 给定一个3~78的整数&#xff0c;将这个整数分成a,b,c&#xff0c;其中1表示…

洛谷P2370yyy2015c01 的 U 盘

传送门——P2370 yyy2015c01 的 U 盘 题解&#xff1a;题目意思很好理解&#xff0c;就是说&#xff0c;当能够达到预期的U盘的最小接口&#xff08;接口越大&#xff0c;能传递的文件越大&#xff09;&#xff0c;然后我们就需要先看题目了&#xff0c;有n个文件&#xff0c;每…

C# 使用Aspose生成和修改文档

Aspose库 C#中的Aspose库是一个强大的文件处理库&#xff0c;可以用于各种文件格式的创建、编辑、转换和操作。该库提供了丰富的功能&#xff0c;包括处理文档、电子表格、幻灯片、PDF、图像等多种文件格式&#xff0c;能够轻松实现文件的读取、写入、格式化、样式设置、数据操…

双指针法 ( 三数之和 )

题目 &#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

设计模式——结构型模式——责任链模式

责任链模式简介 责任链模式&#xff0c;又名职责链模式&#xff0c;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求处理者通过前一对象记住其下一个对象的引用而成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这条链传递&#xff0c;传递过…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十四)- 微服务(4)

目录 8. http客户端Feign 8.1 feign远程调用 8.2 feign自定义配置 8.3 feign性能优化 8.4 feign最佳实践 8. http客户端Feign 8.1 feign远程调用 RestTemplate存在的问题 &#xff1a; 代码可读性差 参数复杂URL难以维护 Feign是声明式的http客户端 使用步骤 &#xf…

03 使用堡塔和xshell

课程的目标 1、理解windows于Linux实现远程通信的过程和所使用的协议SSH 2、熟练使用远程连接工具堡塔和xshell等工具以及SSH和SCP&#xff0c;命令 课程实验 使用堡塔远程并操作centos并实现与windows之间的文件传输 2、使用xshell远程连接并操作centos与windows之间的文…

Day 10:100322. 删除星号以后字典序最小的字符串

Leetcode 100322. 删除星号以后字典序最小的字符串 给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘*’ 字符时&#xff0c;你可以执行以下操作&#xff1a; 删除最左边的 ‘*’ 字符&#xff0c;同时删除该星号…

EasyX的安装及使用

Easy X的下载 首先&#xff0c;打开EasyX的官网&#xff0c;点击下载。 下载完成&#xff0c;直接双击文件。点击下一步&#xff0c;直接点击安装&#xff0c;即可安装完成。 Easy X的使用 要使用Easy X&#xff0c;就要在编写代码时&#xff0c;使用头文件&#xff0c;其有两…

自定义注解处理器生成代码

前言 源码中给的几种注解处理器代码都是网上抄的&#xff0c;本文主要是提供了 Maven 源码&#xff0c;不需要自己网上研究爬坑(当然具体生成代码的逻辑还是得自己写)。且从 lombok 抄了可以解决 idea 代理 ProcessingEnvironment 类后所产生的问题。 以下是网上抄的注解处理…

用java实现客服聊天+网络爬虫下载音乐(java网络编程,io,多线程)

一 灵感&#xff1a; 在2022年的暑假&#xff0c;也就是我即将迈进高三的那个暑假&#xff0c;我并没有察觉自己应该要学习了&#xff0c;还是和过往的暑假一样玩着王者荣耀&#xff0c;凌晨2点睡觉&#xff0c;中午12点起床。我依稀记得这种状态一直持续到8月19。然而离开学还…

最全!最新!最细!Redis数据库从入门到应用

#前言&#xff1a; 该博客会详细介绍关于Redis数据库的内容&#xff0c;代码多有注释&#xff0c;最后会讲解如何将Redis应用&#xff08;以Python与Django为例&#xff09;。各位的点赞与关注将是小编变强的最大动力。 一、Redis数据库简介&#xff1a; Redis是一个开源的内…