实现自动发送: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));
}
}