更改为QCustplot

This commit is contained in:
2024-09-13 17:06:01 +08:00
parent 32b6932875
commit 25a7b25256
13 changed files with 182 additions and 140 deletions

View File

@ -19,6 +19,11 @@ set(PROJECT_SOURCES
mainwindow.ui
gloab.h
gloab.cpp
lib/qcustomplot.h
lib/qcustomplot.cpp
qcustplot.cpp
qcustplot.h
qcustplot.ui
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)

View File

@ -4,10 +4,11 @@ QString Gloab::fileName="";
QVector<QMap<QString,QString>> Gloab::g_param[4];
QMap<QString,QString> Gloab::temData;
QMap<QString,bool> Gloab::namelist;
QList<QtCharts::QChartView*> Gloab::m_chartViews;
QList<QCustPlot*> Gloab::m_QCView;
QWidget * Gloab::widget;
QVector<QString> Gloab::rule;
QFile Gloab::file;
qint64 Gloab::fileSize;
qint64 Gloab::bytesRead;
QCompleter *Gloab::completer;
QVector<double> Gloab::xData,Gloab::yData;

View File

@ -14,19 +14,22 @@
#include <QFile>
#include <QLineSeries>
#include <QCompleter>
#include "qcustplot.h"
class Gloab{
public:
static QString fileName;
static QVector<QMap<QString,QString>> g_param[4];
static QMap<QString,QString> temData;
static QMap<QString,bool> namelist;
static QList<QtCharts::QChartView*> m_chartViews;
static QList<QCustPlot*> m_QCView;
static QWidget *widget;
static QVector<QString> rule;
static QFile file;
static qint64 fileSize;
static qint64 bytesRead;
static QCompleter *completer;
static QVector<double> xData,yData;
};

View File

@ -1,6 +1,6 @@
QT += core gui charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
CONFIG += c++11
@ -10,21 +10,26 @@ CONFIG += c++11
SOURCES += \
gloab.cpp \
lib/qcustomplot.cpp \
main.cpp \
mainwindow.cpp \
qcustplot.cpp \
threadchart.cpp \
threadpoltchart.cpp \
threadread.cpp
HEADERS += \
gloab.h \
lib/qcustomplot.h \
mainwindow.h \
qcustplot.h \
threadchart.h \
threadpoltchart.h \
threadread.h
FORMS += \
mainwindow.ui
mainwindow.ui \
qcustplot.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 12.0.2, 2024-09-12T17:38:37. -->
<!-- Written by QtCreator 12.0.2, 2024-09-13T11:44:52. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

View File

@ -1,6 +1,7 @@
#include "mainwindow.h"
#include <QMessageBox>
#include "lib/qcustomplot.h"
#include "./ui_mainwindow.h"
@ -23,15 +24,11 @@ MainWindow::MainWindow(QWidget *parent)
connect(thread_read, &threadRead::closeProg, this, &MainWindow::closeProg);
//chart
connect(thread_chart, &ThreadChart::newCandS, this, &MainWindow::newCandS);
connect(thread_chart, &ThreadChart::appSeries, this, &MainWindow::appSeries);
connect(thread_chart, &ThreadChart::setChartView, this, &MainWindow::setChartView);
connect(thread_chart, &ThreadChart::setWidget, this, &MainWindow::setWidget);
connect(thread_chart, &ThreadChart::setProgressBar, this, &MainWindow::setProgressBar);
//plot
connect(thread_polt, &threadPoltChart::newCandS, this, &MainWindow::newPlotCandS);
connect(thread_polt, &threadPoltChart::appSeries, this, &MainWindow::appSeries);
connect(thread_polt, &threadPoltChart::setChartView, this, &MainWindow::setPlotChartView);
connect(thread_polt, &threadPoltChart::setWidget, this, &MainWindow::setWidget);
connect(thread_polt, &threadPoltChart::setProgressBar, this, &MainWindow::setProgressBar);
@ -94,7 +91,6 @@ void MainWindow::addCombo(const QStringList &list) {
void MainWindow::setProgressBar(int percent) {
progressBar->setValue(percent);
// qApp->processEvents(); // 更新UI
}
void MainWindow::closeProg() {
@ -103,76 +99,30 @@ void MainWindow::closeProg() {
ui->widget->close();
}
void MainWindow::newCandS() {
chart = new QChart;
series = new QLineSeries;
// series->setPointsVisible();
}
void MainWindow::appSeries(qreal A, qreal B) {
series->append(A, B);
}
void MainWindow::setChartView(int jd, bool isEnum) {
// 设置图表标题
chart->setTitle(QString("基带 %1").arg(jd+1));
chart->addSeries(series);
if (isEnum) {
chart->createDefaultAxes();
// 获取X轴
QList<QAbstractAxis *> xAxes = chart->axes(Qt::Horizontal);
// 断开所有与该轴关联的系列
series->detachAxis(xAxes[0]);
// 从图表中移除轴
chart->removeAxis(xAxes[0]);
} else {
// 创建类别Y轴
QCategoryAxis *axisY = new QCategoryAxis();
for (int var = 1; var < Gloab::rule.size(); ++var) {
axisY->append(Gloab::rule[var], var);
}
//刻度线和刻度的label对齐
axisY->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue);
axisY->setRange(0, Gloab::rule.size() + 1);
chart->setAxisY(axisY, series);
// series->attachAxis(axisY);
}
// 创建一个时间轴
QDateTimeAxis *axisX = new QDateTimeAxis;
axisX->setTickCount(10);
axisX->setFormat("HH:mm"); // 设置时间格式
chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);
// 创建QChartView
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
// 将chartView添加到容器中
Gloab::m_chartViews.append(chartView);
QCustPlot *qCustPlot = new QCustPlot(Gloab::xData, Gloab::yData, jd, isEnum, true);
// 将qCustPlot添加到容器中
Gloab::m_QCView.append(qCustPlot);
}
void MainWindow::setWidget() {
// 设置布局
int wide = 850;
int hight = 600;
if (Gloab::m_chartViews.size() > 1) {
if (Gloab::m_QCView.size() > 1) {
wide = 1800;
}
QGridLayout *gridLayout = new QGridLayout(Gloab::widget);
for (int i = 0, j = 0; i < Gloab::m_chartViews.size(); i++) {
for (int i = 0, j = 0; i < Gloab::m_QCView.size(); i++) {
if (i != 0 && i % 2 == 0) {
j++;
hight += 350;
}
gridLayout->addWidget(Gloab::m_chartViews[i], j, i - 2 * j);
gridLayout->addWidget(Gloab::m_QCView[i], j, i - 2 * j);
}
Gloab::widget->resize(wide, hight);
// Gloab::widget->setMaximumHeight(950);
Gloab::widget->move(70, 20);
Gloab::widget->show();
@ -181,48 +131,13 @@ void MainWindow::setWidget() {
ui->widget->close();
}
void MainWindow::newPlotCandS() {
chart = new QChart;
series = new QLineSeries;
// series->setPointsVisible();
}
void MainWindow::setPlotChartView(int jd, bool isEnum) {
// 设置图表标题
chart->setTitle(QString("基带 %1").arg(jd+1));
chart->addSeries(series);
if (isEnum) {
chart->createDefaultAxes();
} else {
//创建默认XY轴
chart->createDefaultAxes();
//删除Y轴
// 获取Y轴
QList<QAbstractAxis *> yAxes = chart->axes(Qt::Vertical);
// 断开所有与该轴关联的系列
series->detachAxis(yAxes[0]);
// 从图表中移除轴
chart->removeAxis(yAxes[0]);
// 创建类别Y轴
QCategoryAxis *axisY = new QCategoryAxis();
for (int var = 1; var < Gloab::rule.size(); ++var) {
axisY->append(Gloab::rule[var], var);
}
//刻度线和刻度的label对齐
axisY->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue);
axisY->setRange(0, Gloab::rule.size() + 1);
chart->setAxisY(axisY, series);
// plotSeries->attachAxis(axisY);
}
// 创建QChartView
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
// 将chartView添加到容器中
Gloab::m_chartViews.append(chartView);
QCustPlot *qCustPlot = new QCustPlot(Gloab::xData, Gloab::yData, jd, isEnum, false);
// 将qCustPlot添加到容器中
Gloab::m_QCView.append(qCustPlot);
}
void MainWindow::on_lineChart_clicked() {

View File

@ -8,7 +8,7 @@
#include <QDialog>
#include <QVBoxLayout>
#include <QProgressBar>
#include "qcustplot.h"
#include "threadchart.h"
#include "threadpoltchart.h"
@ -38,12 +38,9 @@ private slots:
void setProgressBar(int percent);
void closeProg();
void newCandS();
void appSeries(qreal A,qreal B);
void setChartView(int jd,bool isEnum);
void setWidget();
void newPlotCandS();
void setPlotChartView(int jd,bool isEnum);
void on_lineChart_clicked();

60
qcustplot.cpp Normal file
View File

@ -0,0 +1,60 @@
#include "qcustplot.h"
#include "ui_qcustplot.h"
#include <QDateTime>
#include <QDebug>
#include "gloab.h"
QCustPlot::QCustPlot(QVector<double> xData, QVector<double> yData, int jd, bool isNub, bool isTime,
QWidget *parent)
: QWidget(parent)
, ui(new Ui::QCustPlot)
{
ui->setupUi(this);
//标题
QCPTextElement *m_title;
ui->plot->plotLayout()->insertRow(0);
m_title = new QCPTextElement(ui->plot, QString("基带 %1").arg(jd+1));
ui->plot->plotLayout()->addElement(0, 0, m_title);
// X轴
if (isTime) {
QSharedPointer<QCPAxisTickerDateTime> timeTicker(new QCPAxisTickerDateTime);
timeTicker->setDateTimeFormat("hh:mm:ss");
ui->plot->xAxis->setTicker(timeTicker);
}
// Y轴
if(!isNub){
QVector<double> ticks;
QVector<QString> labels;
for (int i = 1; i < Gloab::rule.size(); ++i) {
ticks.append(i);
labels.append(Gloab::rule[i]);
}
QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
textTicker->addTicks(ticks, labels);
ui->plot->yAxis->setTicker(textTicker);
}
// 添加图形
ui->plot->addGraph();
ui->plot->graph(0)->setData(xData, yData);
// 自动调整轴范围
ui->plot->rescaleAxes();
ui->plot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom );
if(!xData.empty()){
ui->plot->xAxis->setRange(xData.first(),xData.last());
}
}
QCustPlot::~QCustPlot()
{
delete ui;
}

25
qcustplot.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef QCUSTPLOT_H
#define QCUSTPLOT_H
#include <QWidget>
#include "lib/qcustomplot.h"
namespace Ui {
class QCustPlot;
}
class QCustPlot : public QWidget
{
Q_OBJECT
public:
explicit QCustPlot(QVector<double> xData, QVector<double> yData, int jd, bool isNub, bool isTime,
QWidget *parent = nullptr);
~QCustPlot();
private:
Ui::QCustPlot *ui;
};
#endif // QCUSTPLOT_H

39
qcustplot.ui Normal file
View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QCustPlot</class>
<widget class="QWidget" name="QCustPlot">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>673</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QCustomPlot" name="plot" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QCustomPlot</class>
<extends>QWidget</extends>
<header>lib/qcustomplot.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -14,13 +14,15 @@ void ThreadChart::setValue(QVector<int> jd, QString dataName, QDateTime beginTim
void ThreadChart::run() {
Gloab::m_chartViews.clear();
Gloab::m_QCView.clear();
Gloab::rule.clear();
Gloab::rule.append("状态");
//判断右侧数据是否为数字型
bool isEnum = Gloab::namelist[dataName];
for (int i = 0; i < jd.size(); ++i) {
emit newCandS();
// emit newCandS();
Gloab::xData.clear();
Gloab::yData.clear();
qreal y = 114.514;
QString tem1 = "无数据";
// 为每个图表添加数据
@ -35,16 +37,13 @@ void ThreadChart::run() {
if (temTime >= beginTime && temTime < endTime) {
if (!Gloab::g_param[jd[i]][j].contains(dataName)) {
if (y != 114.514) {
emit appSeries(temTime.toMSecsSinceEpoch(), y);
Gloab::xData.append(temTime.toMSecsSinceEpoch()/1000.0);
Gloab::yData.append(y);
}
} else {
if (Gloab::g_param[jd[i]][j][dataName].contains(".")) {
y = Gloab::g_param[jd[i]][j][dataName].toDouble();
emit appSeries(temTime.toMSecsSinceEpoch(), y);
} else {
y = Gloab::g_param[jd[i]][j][dataName].toLongLong();
emit appSeries(temTime.toMSecsSinceEpoch(), y);
}
Gloab::xData.append(temTime.toMSecsSinceEpoch()/1000.0);
Gloab::yData.append(y);
}
}
}
@ -62,14 +61,16 @@ void ThreadChart::run() {
if (!Gloab::rule.contains(tem1)) {
Gloab::rule.append(tem1);
}
emit appSeries(temTime.toMSecsSinceEpoch(), Gloab::rule.indexOf(tem1));
Gloab::xData.append(temTime.toMSecsSinceEpoch()/1000.0);
Gloab::yData.append(Gloab::rule.indexOf(tem1));
}
} else {
tem1 = Gloab::g_param[jd[i]][j][dataName];
if (!Gloab::rule.contains(tem1)) {
Gloab::rule.append(tem1);
}
emit appSeries(temTime.toMSecsSinceEpoch(), Gloab::rule.indexOf(tem1));
Gloab::xData.append(temTime.toMSecsSinceEpoch()/1000.0);
Gloab::yData.append(Gloab::rule.indexOf(tem1));
}
}
}

View File

@ -13,21 +13,18 @@ void threadPoltChart::setValue(QVector<int> jd, QString dataName, QDateTime begi
}
void threadPoltChart::run() {
Gloab::m_chartViews.clear();
Gloab::m_QCView.clear();
Gloab::rule.clear();
Gloab::rule.append("状态");
for (int i = 0; i < jd.size(); ++i) {
int X = 1;
emit newCandS();
// 为每个图表添加数据
//判断右侧数据是否为数字型
bool isEnum = Gloab::namelist[dataName];
if (dataName.contains("版本号")) {
isEnum = false;
}
for (int i = 0; i < jd.size(); ++i) {
int X = 1;
Gloab::xData.clear();
Gloab::yData.clear();
// 为每个图表添加数据
if (isEnum) {
for (int j = 0; j < Gloab::g_param[jd[i]].size(); j++) {
//更新进度条
@ -52,11 +49,8 @@ void threadPoltChart::run() {
QDateTime temTime = QDateTime::fromString(Gloab::g_param[jd[i]][j]["时间"], "yyyy-MM-dd hh:mm:ss:zzz");
if (temTime >= beginTime && temTime < endTime) {
if (Gloab::g_param[jd[i]][j].contains(dataName)) {
if (Gloab::g_param[jd[i]][j][dataName].contains(".")) {
emit appSeries(X++, Gloab::g_param[jd[i]][j][dataName].toDouble());
} else {
emit appSeries(X++, Gloab::g_param[jd[i]][j][dataName].toLongLong());
}
Gloab::xData.append(X++);
Gloab::yData.append(Gloab::g_param[jd[i]][j][dataName].toDouble());
}
}
}
@ -74,7 +68,8 @@ void threadPoltChart::run() {
if (!Gloab::rule.contains(tem1)) {
Gloab::rule.append(tem1);
}
emit appSeries(X++, Gloab::rule.indexOf(tem1));
Gloab::xData.append(X++);
Gloab::yData.append(Gloab::rule.indexOf(tem1));
}
}
}

View File

@ -25,10 +25,6 @@ public:
signals:
void newCandS();
void appSeries(qreal A, qreal B);
void setChartView(int jd, bool isEnum);
void setWidget();