完成时间图绘制

This commit is contained in:
2024-09-18 15:04:38 +08:00
parent d9cdba7cb7
commit 4b64297f68
8 changed files with 262 additions and 21 deletions

View File

@ -22,6 +22,10 @@ set(PROJECT_SOURCES
global.h global.h
readthread.cpp readthread.cpp
readthread.h readthread.h
customtime.h
customtime.cpp
qcustomplot.h
qcustomplot.cpp
) )
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)

View File

@ -9,12 +9,14 @@ CONFIG += c++11
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \ SOURCES += \
customtime.cpp \
main.cpp \ main.cpp \
mainwindow.cpp \ mainwindow.cpp \
qcustomplot.cpp \ qcustomplot.cpp \
readthread.cpp readthread.cpp
HEADERS += \ HEADERS += \
customtime.h \
global.h \ global.h \
mainwindow.h \ mainwindow.h \
qcustomplot.h \ qcustomplot.h \

57
customtime.cpp Normal file
View File

@ -0,0 +1,57 @@
#include "customtime.h"
CustomTimeThread::CustomTimeThread(QObject *parent)
: QThread{parent} {}
void CustomTimeThread::setValue(QVector<int> 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();
}

30
customtime.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef CUSTOMTIMETHREAD_H
#define CUSTOMTIMETHREAD_H
#include <QThread>
#include "global.h"
class CustomTimeThread : public QThread {
Q_OBJECT
public:
explicit CustomTimeThread(QObject *parent = nullptr);
void setValue(QVector<int> vector, QString string);
signals:
void setProgressBar(int bytesRead);
void setPlotView(int jd, bool isNum, bool isTime);
void setWidget();
protected:
void run() override;
private:
QVector<int> jd;
QString dataName;
};
#endif // CUSTOMTIMETHREAD_H

View File

@ -1,30 +1,26 @@
#ifndef READLOG_GLOBAL_H #ifndef READLOG_GLOBAL_H
#define READLOG_GLOBAL_H #define READLOG_GLOBAL_H
#include <QString> #include <QString>
#include <QVector> #include <QVector>
#include <QMap> #include <QMap>
#include <QFile> #include <QFile>
#include <QCompleter> #include <QCompleter>
#include <QWidget>
#include <QDateTime>
#include "qcustomplot.h"
extern QVector<QMap<QString, QString>> g_param[4]; //存储4条基带的数据 extern QVector<QMap<QString, QString>> g_param[4]; //存储4条基带的数据
extern QMap<QString, bool> namelist; //存储数据名以及数据是否是数字 extern QMap<QString, bool> namelist; //存储数据名以及数据是否是数字
extern QFile file; //打开文件 extern QFile file; //打开文件
extern QCompleter *completer; extern QCompleter *completer; //下拉框选项
extern QWidget *widget; //新窗口
extern QDateTime beginTime;
extern QDateTime endTime;
extern QVector<QCustomPlot *> m_PlotView;
extern QVector<QString> rule;
extern QVector<double> xData[4];
extern QVector<double> yData[4];
#endif //READLOG_GLOBAL_H #endif //READLOG_GLOBAL_H

View File

@ -11,6 +11,13 @@ QVector<QMap<QString, QString>> g_param[4];
QMap<QString, bool> namelist; QMap<QString, bool> namelist;
QFile file; QFile file;
QCompleter *completer; QCompleter *completer;
QWidget *widget;
QDateTime beginTime;
QDateTime endTime;
QVector<QCustomPlot *> m_PlotView;
QVector<QString> rule;
QVector<double> xData[4];
QVector<double> yData[4];
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
//设置logo //设置logo

View File

@ -8,7 +8,7 @@
MainWindow::MainWindow(QWidget *parent) 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); ui->setupUi(this);
// 创建版本号标签并添加到状态栏的右端 // 创建版本号标签并添加到状态栏的右端
QLabel *m_versionLabel = new QLabel(tr("v1.2.0"), 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::setEndTime, this, &MainWindow::setEndTime);
connect(readThread, &ReadThread::addCombo, this, &MainWindow::addCombo); connect(readThread, &ReadThread::addCombo, this, &MainWindow::addCombo);
connect(readThread, &ReadThread::closeProg, this, &MainWindow::closeProg); 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() { MainWindow::~MainWindow() {
@ -56,7 +62,69 @@ void MainWindow::on_openFileBtn_clicked() {
void MainWindow::on_timeCustomBtn_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<int> 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(); 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<QCPAxisTickerDateTime> timeTicker(new QCPAxisTickerDateTime);
timeTicker->setDateTimeFormat("hh:mm:ss");
qCustomPlot->xAxis->setTicker(timeTicker);
}
// Y轴
if (!isNum) {
QVector<double> ticks;
QVector<QString> labels;
for (int i = 0; i < rule.size(); ++i) {
ticks.append(i);
labels.append(rule[i]);
}
QSharedPointer<QCPAxisTickerText> 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();
}

View File

@ -5,6 +5,7 @@
#include "global.h" #include "global.h"
#include "readthread.h" #include "readthread.h"
#include "customtime.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { namespace Ui {
@ -53,9 +54,15 @@ private slots:
/*关闭进度条*/ /*关闭进度条*/
void closeProg(); void closeProg();
void setPlotView(int jd, bool isNum, bool isTime);
void setWidget();
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
ReadThread *readThread; ReadThread *readThread;
CustomTimeThread *customTime;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H