diff --git a/CMakeLists.txt b/CMakeLists.txt index bb3b6e3..dce3a96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,10 @@ set(PROJECT_SOURCES global.h readthread.cpp readthread.h + customtime.h + customtime.cpp + qcustomplot.h + qcustomplot.cpp ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/ReadLog.pro b/ReadLog.pro index 48f3445..f0d5b6a 100644 --- a/ReadLog.pro +++ b/ReadLog.pro @@ -9,12 +9,14 @@ CONFIG += c++11 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + customtime.cpp \ main.cpp \ mainwindow.cpp \ qcustomplot.cpp \ readthread.cpp HEADERS += \ + customtime.h \ global.h \ mainwindow.h \ qcustomplot.h \ diff --git a/customtime.cpp b/customtime.cpp new file mode 100644 index 0000000..a2dca75 --- /dev/null +++ b/customtime.cpp @@ -0,0 +1,57 @@ +#include "customtime.h" + +CustomTimeThread::CustomTimeThread(QObject *parent) + : QThread{parent} {} + +void CustomTimeThread::setValue(QVector vector, QString string) { + this->jd = vector; + this->dataName = string; +} + +void CustomTimeThread::run() { + m_PlotView.clear(); + rule.clear(); + + for (int var = 0; var < 4; ++var) { + xData[var].clear(); + yData[var].clear(); + } + //判断右侧数据是否为数字型 + bool isEnum = namelist[dataName]; + int bytesRead = 0; + for (int i = 0; i < jd.size(); ++i) { + QString tem = "这是一个无实际作用的标识"; + for (int j = 0; j < g_param[jd[i]].size(); j++) { + //更新进度条 + bytesRead++; + emit setProgressBar(bytesRead); + + QDateTime temTime = QDateTime::fromString(g_param[jd[i]][j]["时间"], "yyyy-MM-dd hh:mm:ss:zzz"); + if (temTime >= beginTime && temTime < endTime) { + if (g_param[jd[i]][j].contains(dataName)) { + tem = g_param[jd[i]][j][dataName]; + } else { + if (tem == "这是一个无实际作用的标识") { + continue; + } + } + xData[jd[i]].append(temTime.toMSecsSinceEpoch() / 1000.0); + if (isEnum) { + yData[jd[i]].append(tem.toDouble()); + } else { + if (rule.contains(tem)) { + yData[jd[i]].append(rule.indexOf(tem)); + } else { + rule.append(tem); + yData[jd[i]].append(rule.indexOf(tem)); + } + } + } + } + emit setPlotView(jd[i], isEnum, true); + } + + emit setWidget(); + quit(); +} + diff --git a/customtime.h b/customtime.h new file mode 100644 index 0000000..807fe15 --- /dev/null +++ b/customtime.h @@ -0,0 +1,30 @@ +#ifndef CUSTOMTIMETHREAD_H +#define CUSTOMTIMETHREAD_H + +#include +#include "global.h" + +class CustomTimeThread : public QThread { +Q_OBJECT +public: + explicit CustomTimeThread(QObject *parent = nullptr); + + void setValue(QVector vector, QString string); + +signals: + + void setProgressBar(int bytesRead); + + void setPlotView(int jd, bool isNum, bool isTime); + + void setWidget(); + +protected: + void run() override; + +private: + QVector jd; + QString dataName; +}; + +#endif // CUSTOMTIMETHREAD_H diff --git a/global.h b/global.h index 447de00..a6d5e49 100644 --- a/global.h +++ b/global.h @@ -1,30 +1,26 @@ #ifndef READLOG_GLOBAL_H #define READLOG_GLOBAL_H + #include #include #include #include #include +#include +#include +#include "qcustomplot.h" -extern QVector> g_param[4]; //存储4条基带的数据 -extern QMap namelist; //存储数据名以及数据是否是数字 +extern QVector> g_param[4]; //存储4条基带的数据 +extern QMap namelist; //存储数据名以及数据是否是数字 extern QFile file; //打开文件 -extern QCompleter *completer; - - - - - - - - - - - - - - - +extern QCompleter *completer; //下拉框选项 +extern QWidget *widget; //新窗口 +extern QDateTime beginTime; +extern QDateTime endTime; +extern QVector m_PlotView; +extern QVector rule; +extern QVector xData[4]; +extern QVector yData[4]; #endif //READLOG_GLOBAL_H diff --git a/main.cpp b/main.cpp index eb698b2..7e2f8f9 100644 --- a/main.cpp +++ b/main.cpp @@ -11,12 +11,19 @@ QVector> g_param[4]; QMap namelist; QFile file; QCompleter *completer; +QWidget *widget; +QDateTime beginTime; +QDateTime endTime; +QVector m_PlotView; +QVector rule; +QVector xData[4]; +QVector yData[4]; int main(int argc, char *argv[]) { //设置logo QApplication::setWindowIcon(QIcon("logo.ico")); //放大窗口 -// qputenv("QT_SCALE_FACTOR", "2.0"); + // qputenv("QT_SCALE_FACTOR", "2.0"); //设置使用UTF8字符集,正确显示中文 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); diff --git a/mainwindow.cpp b/mainwindow.cpp index 6be9fc1..0a59567 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -8,7 +8,7 @@ MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), ui(new Ui::MainWindow), readThread(new ReadThread) { + : QMainWindow(parent), ui(new Ui::MainWindow), readThread(new ReadThread), customTime(new CustomTimeThread) { ui->setupUi(this); // 创建版本号标签并添加到状态栏的右端 QLabel *m_versionLabel = new QLabel(tr("v1.2.0"), this); @@ -25,6 +25,12 @@ MainWindow::MainWindow(QWidget *parent) connect(readThread, &ReadThread::setEndTime, this, &MainWindow::setEndTime); connect(readThread, &ReadThread::addCombo, this, &MainWindow::addCombo); connect(readThread, &ReadThread::closeProg, this, &MainWindow::closeProg); + + //customTime + connect(customTime, &CustomTimeThread::setProgressBar, this, &MainWindow::setProgressBar); + connect(customTime, &CustomTimeThread::setPlotView, this, &MainWindow::setPlotView); + connect(customTime, &CustomTimeThread::setWidget, this, &MainWindow::setWidget); + } MainWindow::~MainWindow() { @@ -56,7 +62,69 @@ void MainWindow::on_openFileBtn_clicked() { void MainWindow::on_timeCustomBtn_clicked() { - ui->progressBar->close(); + if (file.fileName().isEmpty()) { + QMessageBox::warning(this, "警告", "请先打开一个日志"); + return; + } + + //关闭打开的窗口 + if (widget) { + widget->close(); + delete widget; + widget = nullptr; + } + + //获取基带id + QVector jd; + if (ui->jd1->isChecked()) { + jd.append(0); + } + if (ui->jd2->isChecked()) { + jd.append(1); + } + if (ui->jd3->isChecked()) { + jd.append(2); + } + if (ui->jd4->isChecked()) { + jd.append(3); + } + + if (jd.isEmpty()) { + QMessageBox::warning(this, "警告", "请至少选择一个基带"); + return; + } + + //获取时间 + beginTime = ui->beginTimeEdit->dateTime(); + endTime = ui->endTimeEdit->dateTime(); + if (beginTime > endTime) { + QMessageBox::warning(this, "警告", "请选择正确的时间段"); + return; + } + //获取参数名 + QString dataName = ui->comboBox->currentText(); + if (!namelist.keys().contains(dataName)) { + QMessageBox::warning(this, "警告", "未找到该数据"); + return; + } + + //传入数据绘图 + customTime->setValue(jd, dataName); + widget = new QWidget(); + widget->setWindowTitle(dataName); + + // 获取文件大小 + int fileSize = 0; + for (int i = 0; i < jd.size(); ++i) { + fileSize += g_param[jd[i]].size(); + } + + //设置进度条 + ui->progressBar->setValue(0); + ui->progressBar->setMaximum(fileSize); + ui->progressBar->show(); + + customTime->start(); } @@ -97,3 +165,73 @@ void MainWindow::closeProg() { ui->progressBar->close(); } +void MainWindow::setPlotView(int jd, bool isNum, bool isTime) { + QCustomPlot *qCustomPlot = new QCustomPlot(); + //标题 + QCPTextElement *m_title; + qCustomPlot->plotLayout()->insertRow(0); + m_title = new QCPTextElement(qCustomPlot, QString("基带 %1").arg(jd + 1)); + qCustomPlot->plotLayout()->addElement(0, 0, m_title); + + // X轴 + if (isTime) { + QSharedPointer timeTicker(new QCPAxisTickerDateTime); + timeTicker->setDateTimeFormat("hh:mm:ss"); + qCustomPlot->xAxis->setTicker(timeTicker); + } + + // Y轴 + if (!isNum) { + QVector ticks; + QVector labels; + for (int i = 0; i < rule.size(); ++i) { + ticks.append(i); + labels.append(rule[i]); + } + QSharedPointer textTicker(new QCPAxisTickerText); + textTicker->addTicks(ticks, labels); + qCustomPlot->yAxis->setTicker(textTicker); + } else { +// qCustomPlot->yAxis->setNumberFormat("f"); //以数字形式显示 +// qCustomPlot->yAxis->setNumberPrecision(2); //显示两位小数 + } + + // 添加图形 + qCustomPlot->addGraph(); + qCustomPlot->graph(0)->setData(xData[jd], yData[jd]); + + + // 自动调整轴范围 + qCustomPlot->rescaleAxes(); + + qCustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); + + if (!xData[jd].empty()) { + qCustomPlot->xAxis->setRange(xData[jd].first(), xData[jd].last()); + } + + m_PlotView.append(qCustomPlot); +} + +void MainWindow::setWidget() { + // 设置布局 + int wide = 850; + int hight = 600; + if (m_PlotView.size() > 1) { + wide = 1800; + } + QGridLayout *gridLayout = new QGridLayout(widget); + for (int i = 0, j = 0; i < m_PlotView.size(); i++) { + if (i != 0 && i % 2 == 0) { + j++; + hight += 350; + } + gridLayout->addWidget(m_PlotView[i], j, i - 2 * j); + } + widget->resize(wide, hight); + widget->move(70, 20); + widget->show(); + + ui->progressBar->close(); +} + diff --git a/mainwindow.h b/mainwindow.h index 7a9e615..5ebe335 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -5,6 +5,7 @@ #include "global.h" #include "readthread.h" +#include "customtime.h" QT_BEGIN_NAMESPACE namespace Ui { @@ -53,9 +54,15 @@ private slots: /*关闭进度条*/ void closeProg(); + void setPlotView(int jd, bool isNum, bool isTime); + + void setWidget(); + + private: Ui::MainWindow *ui; ReadThread *readThread; + CustomTimeThread *customTime; }; #endif // MAINWINDOW_H