1.文件读取及数据存储功能
在数据量比较大时,我们希望能够直接读取文件发送、或者将接收到的数据存储成文件,方便后续分析。如下图所示两个按钮将实现该功能。
![文件功能.png](https://static.rymcu.com/article/1612792550301.png)
2.读取文件功能
//读取文件,并显示在发送窗口
void MainWindow::on_pushButtonRdFile_clicked()
{
QString curPath=QDir::currentPath();//获取系统当前目录
QString dlgTitle="打开一个文件"; //对话框标题
QString filter="文本文件(*.txt);;所有文件(*.*)"; //文件过滤器
QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
if (aFileName.isEmpty())
return;
openTextByIODevice(aFileName);
}
/***********************************************************
*编码格式转换
*防止GBK中文乱码
***********************************************************/
QString MainWindow::byteArrayToUnicode(const QByteArray &array)
{
// state用于保存转换状态,它的成员invalidChars,可用来判断是否转换成功
// 如果转换成功,则值为0,如果值大于0,则说明转换失败
QTextCodec::ConverterState state;
// 先尝试使用utf-8的方式把QByteArray转换成QString
QString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state);
// 如果转换时无效字符数量大于0,说明编码格式不对
if (state.invalidChars > 0)
{
// 再尝试使用GBK的方式进行转换,一般就能转换正确(当然也可能是其它格式,但比较少见了)
text = QTextCodec::codecForName("GBK")->toUnicode(array);
}
return text;
}
3.保存文件功能
/***********************************************************
*写文件函数
*执行文件保存工作
***********************************************************/
bool MainWindow::saveTextByIODevice(const QString &aFileName)
{ //用IODevice方式保存文本文件
QFile aFile(aFileName);
//aFile.setFileName(aFileName);
if (!aFile.open(QIODevice::WriteOnly | QIODevice::Text))
return false;
QString str=ui->TextRev->toPlainText();//整个内容作为字符串
QByteArray strBytes=str.toUtf8();//转换为字节数组
aFile.write(strBytes,strBytes.length()); //写入文件
aFile.close();
return true;
}
4.小结
上述涉及到文件处理,记得添加相应的头文件。
|