(文章目录)
前言
在前几篇文章中我们已经完成了串口的基本布局和串口的收发功能,下面我们对串口的其他功能进行完善。
一、保存接收到的数据
这里首先使用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串口助手
即可获取。 大家也可以自己对这个串口助手进行改造,相信大家可以做的更好。