解析csv數據繪制曲線圖


  一個解析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(" ");
        //是否切割邊緣點標簽,默認為true
        series->setPointLabelsClipping(false);

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

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM