#include "frmcurve.h" #include "ui_frmcurve.h" #include "quihelper.h" #define Text_Color QColor(255, 255, 255) #define TempDotColor QColor(5, 189, 251) #define TempLineColor QColor(41, 138, 220) #define TextWidth 0.3 #define LineWidth 1.5 #define DotWidth 5 frmCurve::frmCurve(QWidget *parent) : QWidget(parent), ui(new Ui::frmCurve) { ui->setupUi(this); this->initForm(); this->ininTable(); this->initPlot(); this->initData(); this->loadData(); } frmCurve::~frmCurve() { delete ui; } void frmCurve::initForm() { //X轴数据个数 maxX = 10; //Y轴最大值 maxY = 200; //放大缩小倍数 scal = 20; customPlot = new QCustomPlot; ui->layout->addWidget(customPlot); connect(ui->btnReturn, SIGNAL(pressed()), this, SIGNAL(returnMain())); } void frmCurve::ininTable() { int columnCount = 2; QList columnNames; QList columnWidths; columnNames << tr("time") << tr("temp"); columnWidths << 100 << 70; ui->tableWidget->setColumnCount(columnCount); for (int i = 0; i < columnCount; i++) { ui->tableWidget->setColumnWidth(i, columnWidths.at(i)); } ui->tableWidget->setHorizontalHeaderLabels(columnNames); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //ui->tableWidget->setAlternatingRowColors(false); ui->tableWidget->verticalHeader()->setVisible(false); ui->tableWidget->verticalHeader()->setDefaultSectionSize(25); ui->tableWidget->horizontalHeader()->setStretchLastSection(true); } void frmCurve::initPlot() { customPlot->addGraph(); customPlot->graph(0)->setName(tr("Temp")); customPlot->graph(0)->setPen(QPen(TempLineColor, LineWidth)); customPlot->graph(0)->setScatterStyle( QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(TempDotColor, LineWidth), QBrush(TempDotColor), DotWidth)); QFont font = QFont(qApp->font().family(), 8); customPlot->legend->setFont(font); customPlot->xAxis->setLabelFont(font); customPlot->yAxis->setLabelFont(font); customPlot->xAxis->setTickLabelFont(font); customPlot->yAxis->setTickLabelFont(font); //将对应的key用文本替代表示 #ifdef qcustomplot_v1 customPlot->xAxis->setTickVector(keys); customPlot->xAxis->setTickVectorLabels(labs); customPlot->yAxis->setAutoTickCount(7); #else //设置标尺为文本标尺 QSharedPointer ticker(new QCPAxisTickerText); ticker->addTicks(keys, labs); customPlot->xAxis->setTicker(ticker); customPlot->yAxis->ticker()->setTickCount(7); #endif customPlot->yAxis->setLabel(tr("%1 Curve").arg(name)); customPlot->yAxis->setLabelColor(Text_Color); customPlot->xAxis->setTickLabelColor(Text_Color); customPlot->yAxis->setTickLabelColor(Text_Color); customPlot->xAxis->setBasePen(QPen(Text_Color, TextWidth)); customPlot->yAxis->setBasePen(QPen(Text_Color, TextWidth)); customPlot->xAxis->setTickPen(QPen(Text_Color, TextWidth)); customPlot->yAxis->setTickPen(QPen(Text_Color, TextWidth)); customPlot->xAxis->setSubTickPen(QPen(Text_Color, TextWidth)); customPlot->yAxis->setSubTickPen(QPen(Text_Color, TextWidth)); customPlot->setBackground(QColor(80, 80, 80)); customPlot->axisRect()->setBackground(QColor(50, 50, 50)); customPlot->replot(); } void frmCurve::initData() { keys.clear(); values.clear(); labs.clear(); for (int i = 0; i < maxX; i++) { keys.append(i); values.append((rand() % 10) + 80); labs.append(TIME); } } void frmCurve::loadData() { double value = (rand() % 10) + 80; appendTempValue(TIME, value); } void frmCurve::setName(const QString &name) { this->name = name; } void frmCurve::setMaxX(int maxX) { if (this->maxX != maxX) { this->maxX = maxX; customPlot->xAxis->setRange(-0.5, maxX - 0.5); customPlot->replot(); } } void frmCurve::setMaxY(int maxY) { if (this->maxY != maxY && (maxY / 20) > 0) { this->maxY = maxY; customPlot->yAxis->setRange(0, maxY); #ifdef qcustomplot_v1 customPlot->yAxis->setAutoTickCount(maxY / 20); #else customPlot->yAxis->ticker()->setTickCount(maxY / 20); #endif customPlot->replot(); } } void frmCurve::appendTempValue(const QString &time, double value) { //移除第一个数据,增加一个数据,保证每次集合数据一致 labs.remove(0, 1); labs.append(time); values.remove(0, 1); values.append(value); customPlot->graph(0)->setData(keys, values); #ifdef qcustomplot_v1 customPlot->xAxis->setTickVector(keys); customPlot->xAxis->setTickVectorLabels(labs); #else QSharedPointer ticker(new QCPAxisTickerText); ticker->addTicks(keys, labs); customPlot->xAxis->setTicker(ticker); #endif customPlot->replot(); } void frmCurve::loadData(const QString &fileName) { QStringList times, temps; //判断拓展名是否存在,不存在则加上 QString name = fileName; if (!name.endsWith(".csv")) { name = name + ".csv"; } //打开数据文件 QFile file(name); if (file.open(QFile::ReadOnly)) { while (!file.atEnd()) { QString str = file.readLine(); str.replace("\n", ""); QStringList list = str.split(","); times << list.at(0); temps << list.at(1); } } qDebug() << times << temps; //显示到表格中 int count = times.count(); ui->tableWidget->setRowCount(count); for (int i = 0; i < count; i++) { ui->tableWidget->setItem(i, 0, new QTableWidgetItem(times.at(i))); ui->tableWidget->setItem(i, 1, new QTableWidgetItem(times.at(i))); } //显示到曲线中 for (int i = 0; i < count; i++) { appendTempValue(times.at(i), temps.at(i).toDouble()); } } void frmCurve::saveData(const QString &fileName, const QStringList ×, const QStringList &temps) { //判断拓展名是否存在,不存在则加上 QString name = fileName; if (!name.endsWith(".csv")) { name = name + ".csv"; } //保存数据文件 QFile file(name); if (file.open(QFile::WriteOnly)) { file.resize(0); QStringList data; //写入标题 //data << QString("%1,%2\n").arg("time").arg("temp"); //逐行写入数据 int count = times.count(); for (int i = 0; i < count; i++) { data << QString("%1,%2\n").arg(times.at(i)).arg(temps.at(i)); } file.write(data.join("").toLatin1()); } //保存图片文件 name.replace(".csv", ""); customPlot->saveJpg(name + ".jpg"); } void frmCurve::on_btnAdd_clicked() { int count = ui->tableWidget->rowCount() + 1; ui->tableWidget->setRowCount(count); //实例化子对象不然保存时候会报错 for (int i = 0; i < 2; i++) { ui->tableWidget->setItem(count - 1, i, new QTableWidgetItem("")); } } void frmCurve::on_btnDelete_clicked() { int row = ui->tableWidget->currentRow(); if (row < 0) { return; } ui->tableWidget->removeRow(row); } void frmCurve::on_btnClear_clicked() { ui->tableWidget->setRowCount(0); } void frmCurve::on_btnLoad_clicked() { QString fileName = QFileDialog::getOpenFileName(0, "选择文件", QUIHelper::appPath(), "CSV文件 (*.csv)"); if (fileName.isEmpty()) { return; } loadData(fileName); } void frmCurve::on_btnSave_clicked() { QString fileName = QFileDialog::getSaveFileName(0, "选择文件", QUIHelper::appPath(), "CSV文件 (*.csv)"); if (fileName.isEmpty()) { return; } //取出列表 QStringList times, temps; int count = ui->tableWidget->rowCount(); for (int i = 0; i < count; i++) { QTableWidgetItem *itemTime = ui->tableWidget->item(i, 0); QTableWidgetItem *itemTemp = ui->tableWidget->item(i, 1); //过滤非法的时间 QString str = itemTime->text(); QTime time = QTime::fromString(str, "hh:mm:ss"); if (time.isValid()) { times << str; temps << itemTemp->text(); } } qDebug() << times << temps; saveData(fileName, times, temps); }