解析csv資料繪製曲線圖

大白不會敲程式碼 發表於 2021-10-13

  一個解析csv資料的小工具,所做專案中要檢視脈衝圖譜,經理就讓我這個剛入職的小萌新寫了個小程式。同事將csv格式的脈衝資料發給我,我的想法就是,將這些csv裡的資料作為縱軸,x++為橫軸,繪製出折線圖,並將幅值整體偏低的脈衝加上個係數顯示出來。

  因為用到了QChart,所以在.pro檔案中先加語句 QT += charts   

       在ui介面中,加入了一個 Widget控制元件顯示折線圖(chart_view),在控制元件lineedit顯示開啟檔案的路徑和檔名,控制元件textedit顯示開啟的csv文字里的資料。點選按鈕“開啟檔案”後,就可以選擇要開啟的檔案,選好後,會顯示出圖譜和檔案路徑和csv中資料。點選“儲存檔案”把csv資料儲存到本地為.txt文字。

  解析csv資料繪製曲線圖

 程式碼:

#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;
}

 

   目前還稍微有點小漏洞,就是不能在介面連續讀取檔案顯示曲線圖並儲存,各位大佬要是有什麼好辦法,感謝分享呀!!

相關文章