前言
在前几篇文章中我们已经完成了串口的基本布局和串口的收发功能,下面我们对串口的其他功能进行完善。
一、保存接收到的数据
这里首先使用QFileDialog中的getSaveFileName函数打开一个文件对话框得到要保存的文件名,然后判断文件名是否为空,不为空的话打开文件,使用QTextStream将接收到的数据写入文件中,最后关闭文件。
/*保存接收到的数据*/ void SerialPort::on_saveRecvbtn_clicked() { /*得到选择的文件名*/ QString filename = QFileDialog::getSaveFileName(this, "另存为", "C:/", tr("Text Files(*.txt)")); /*判断文件名是否为空*/ if(!filename.isEmpty()) { QFile file(filename); if(file.open(QIODevice::WriteOnly)) { QTextStream out(&file); out << ui->RecvText->toPlainText(); file.close(); } } }
二、隐藏面板
这个函数大家一看就能明白。
/*隐藏面板*/ void SerialPort::on_Showhidebtn_clicked() { MulisHide = !MulisHide; if(MulisHide) { ui->MulBox->show(); ui->Showhidebtn->setText("隐藏面板"); } else { ui->Showhidebtn->setText("拓展面板"); ui->MulBox->hide(); } }
三、多文本框的操作
重置多文本框区域的状态和清空字符串。
/*重置发送特定字符串区域*/ void SerialPort::on_Resetbtn_clicked() { QMessageBox::StandardButton ret = QMessageBox::information(this, "提示", "重置表格将不可逆,确认是否重置?" , QMessageBox::Yes | QMessageBox::No); if(ret == QMessageBox::Yes) { /*清除多文本发送区域的字符串*/ ui->StringEdit1->clear(); ui->StringEdit2->clear(); ui->StringEdit3->clear(); ui->StringEdit4->clear(); ui->StringEdit5->clear(); ui->StringEdit6->clear(); ui->StringEdit7->clear(); ui->lineEdit_17->clear(); /*清除HEX的状态*/ ui->HexSend1->setChecked(false); ui->HexSend2->setChecked(false); ui->HexSend3->setChecked(false); ui->HexSend4->setChecked(false); ui->HexSend5->setChecked(false); ui->HexSend6->setChecked(false); ui->HexSend7->setChecked(false); ui->HexSend8->setChecked(false); } }
保存多文本框中的状态和字符串:
这里我们将是否选择hex和字符串使用@分隔开来方便我们读取。
一个状态和一个字符串对应文件中的一行数据。
/*保存多文本框中的数据*/ void SerialPort::on_pushButton_9_clicked() { /*得到选择的文件名*/ QString filename = QFileDialog::getSaveFileName(this, "另存为", "C:/", tr("Text Files(*.txt)")); /*判断文件名是否为空*/ if(!filename.isEmpty()) { QFile file(filename); if(file.open(QIODevice::WriteOnly)) { QTextStream out(&file); out << QString::number(ui->HexSend1->isChecked()) +"@" + ui->StringEdit1->text(); out << "\n"; out << QString::number(ui->HexSend2->isChecked()) +"@"+ ui->StringEdit2->text(); out << "\n"; out << QString::number(ui->HexSend3->isChecked()) +"@"+ ui->StringEdit3->text(); out << "\n"; out << QString::number(ui->HexSend4->isChecked()) +"@"+ ui->StringEdit4->text(); out << "\n"; out << QString::number(ui->HexSend5->isChecked()) +"@"+ ui->StringEdit5->text(); out << "\n"; out << QString::number(ui->HexSend6->isChecked()) +"@"+ ui->StringEdit6->text(); out << "\n"; out << QString::number(ui->HexSend7->isChecked()) +"@"+ ui->StringEdit7->text(); out << "\n"; out << QString::number(ui->HexSend8->isChecked()) +"@"+ ui->lineEdit_17->text(); file.close(); } } }
读取文件中的多文本框数据并显示出来:
这里使用到了QString中的split函数,因为上面我们使用@来分隔数据所以我们使用这个函数可以分别得到状态和字符串。
得到后我们将对应的状态和字符串保存到m_HexStatusList和m_SendStringList链表中。保存完成后根据保存的数据设置多文本框的状态和数据。
/*读取保存到的数据并载入多文本框中*/ void SerialPort::on_pushButton_10_clicked() { m_HexStatusList.clear(); m_SendStringList.clear(); /*得到选择的文件名*/ QString filename = QFileDialog::getOpenFileName(this, "载入文件", "C:/", tr("Text Files(*.txt)")); /*判断文件名是否为空*/ if(!filename.isEmpty()) { QFile file(filename); if(file.open(QIODevice::ReadOnly)) { QTextStream in(&file); while(!in.atEnd()) { QString data = in.readLine(); QStringList str = data.split('@'); m_HexStatusList.append(str[0]); m_SendStringList.append(str[1]); } file.close(); } } /*将读取出来的状态和字符串设置进去*/ ui->HexSend1->setChecked(m_HexStatusList[0].toInt()); ui->StringEdit1->setText(m_SendStringList[0]); ui->HexSend2->setChecked(m_HexStatusList[1].toInt()); ui->StringEdit2->setText(m_SendStringList[1]); ui->HexSend3->setChecked(m_HexStatusList[2].toInt()); ui->StringEdit3->setText(m_SendStringList[2]); ui->HexSend4->setChecked(m_HexStatusList[3].toInt()); ui->StringEdit4->setText(m_SendStringList[3]); ui->HexSend5->setChecked(m_HexStatusList[4].toInt()); ui->StringEdit5->setText(m_SendStringList[4]); ui->HexSend6->setChecked(m_HexStatusList[5].toInt()); ui->StringEdit6->setText(m_SendStringList[5]); ui->HexSend7->setChecked(m_HexStatusList[6].toInt()); ui->StringEdit7->setText(m_SendStringList[6]); ui->HexSend8->setChecked(m_HexStatusList[7].toInt()); ui->lineEdit_17->setText(m_SendStringList[7]); }
总结
主要的功能我们已经基本实现了,我会将源代码放在公众号中,回复:QT串口助手即可获取。
大家也可以自己对这个串口助手进行改造,相信大家可以做的更好。