一個解析csv資料的小工具,所做專案中要檢視脈衝圖譜,經理就讓我這個剛入職的小萌新寫了個小程式。同事將csv格式的脈衝資料發給我,我的想法就是,將這些csv裡的資料作為縱軸,x++為橫軸,繪製出折線圖,並將幅值整體偏低的脈衝加上個係數顯示出來。
因為用到了QChart,所以在.pro檔案中先加語句 QT += charts
在ui介面中,加入了一個 Widget控制元件顯示折線圖(chart_view),在控制元件lineedit顯示開啟檔案的路徑和檔名,控制元件textedit顯示開啟的csv文字里的資料。點選按鈕“開啟檔案”後,就可以選擇要開啟的檔案,選好後,會顯示出圖譜和檔案路徑和csv中資料。點選“儲存檔案”把csv資料儲存到本地為.txt文字。
程式碼:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QtCharts/QChartView>//顯示圖表
#include <QtCharts/QLineSeries>//線系列
#include <QFileDialog>
#include <QDir>
#include <QString>
#include <QStringList>
#include <QDebug>
#include <QtCore/QTextStream>
#include <QtCore/QIODevice>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("pluse脈衝解析");
setFixedSize(940,740);
connect(ui->btn_read, &QPushButton::clicked, this ,[=](){//開啟檔案
QT_CHARTS_USE_NAMESPACE
QString FileName = QFileDialog::getOpenFileName(this,"開啟檔案","C:\\");
if(FileName.isEmpty() == true)
{
QMessageBox::warning(this,"warning","open file failed!");
return;
}
ui->lineEdit->setText(FileName);
QList<QLineSeries *> m_series;
QLineSeries *series = new QLineSeries();
m_series.append(series);
//設定線條名稱
series->setName(QString("csv解析圖譜"));
//設定線條顏色,如果不設定會給預設顏色
series->setColor(QColor(255,0,255));
//設定是否線條可視
series->setVisible(true);
//點標籤是否可視
series->setPointLabelsVisible(true);
//點標籤顏色
series->setPointLabelsColor(QColor(255,255,255));
//點標籤字型
series->setPointLabelsFont(QFont("微軟雅黑"));
//設定點標籤顯示格式
series->setPointLabelsFormat(" ");
//series->setPointLabelsFormat("(@xPoint,@yPoint)");
//是否切割邊緣點標籤,預設為true
series->setPointLabelsClipping(false);
//設定點標籤是否可視
//series->setPointsVisible(true);
QFile file(FileName);
if(file.open(QIODevice::ReadOnly))
{
QTextStream stream(&file);
while(!file.atEnd())
{
QStringList list = stream.readAll().split('\n');
QListIterator<QString> li(list);
QString str = list.join(",");
QString str1 = str.simplified(); //去除字串前後的空白符,並用“ ”分開
str1.remove(QRegExp("\\s")); //去除所有字串中出現的“ ”
QString str2 = str1.section(",",0,1023); //只取脈衝訊號列表的前1024項
ui->textEdit->setText(str2);
float buf;
int x = 1;
series->clear();
while(li.hasNext())
{
buf=li.next().toFloat();
if(x <= 1024)
{
series->append(x,buf * 32768);
x++;
}
else
break;
}
}
}
QChart *chart = new QChart();
chart->setTheme(QChart::ChartThemeBlueCerulean);//設定系統主題
chart->setAnimationOptions(QChart::AllAnimations);//設定啟用或禁用動畫
chart->setLocalizeNumbers(true);//數字是否本地化
chart->addSeries(series);//新增系列到QChart上
chart->createDefaultAxes();//建立預設軸
chart->setTitle("脈衝影像");//設定標題
chart->setTitleBrush(QBrush(QColor(25,170,255)));//設定標題Brush
chart->setTitleFont(QFont("微軟雅黑"));//設定標題字型
chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);//底部對齊
chart->legend()->setBackgroundVisible(true);//設定背景是否可視
chart->legend()->setLabelColor(QColor(255,128,255));//設定標籤顏色
chart->legend()->setVisible(true);//設定是否可視
chart->legend()->setBorderColor(QColor(255,255,170,185));//設定邊框顏色
QFont font = chart->legend()->font();
font.setItalic(!font.italic());
chart->legend()->setFont(font);//設定字型為斜體
font.setPointSizeF(12);
chart->legend()->setFont(font);//設定字型大小
chart->legend()->setFont(QFont("微軟雅黑"));//設定字型型別
QChartView *chartView = new QChartView(chart);
QGridLayout *baselayout = new QGridLayout();
baselayout->addWidget(chartView,1,0);
chartView->setChart(chart);
ui->chart_view->setLayout(baselayout);
connect(ui->btn_save,&QPushButton::clicked,this,[=](){//儲存檔案
QFile sfile("pluse.txt");
if(sfile.open(QFile::WriteOnly))
{
QTextStream out(&sfile);
//out<<ui->textEdit->setText()
out<<ui->textEdit->toPlainText()<<endl<<QObject::tr("");
QMessageBox::warning(this,"儲存中...","檔案儲存成功!");
}
});
file.close();
});
}
MainWindow::~MainWindow()
{
delete ui;
}
目前還稍微有點小漏洞,就是不能在介面連續讀取檔案顯示曲線圖並儲存,各位大佬要是有什麼好辦法,感謝分享呀!!