从零开始实现自己的串口调试助手(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));
    }
}

实现效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值