(4) Entwicklung dynamischer Anzeigeinstanzen für das QCustomPlot-Histogramm

Artikelverzeichnis der Serie

提示:这里是该系列文章的所有文章的目录
Kapitel 1: (1) Realisierung der allgemeinen Eigenschaftseinstellungen von QCustomPlot, Zeichnen mehrerer Kurven, dynamisches Kurvenzeichnen, Generieren von Cursorn, Vergrößern von Rechtecken usw. Kapitel 2: (2) QCustomPlot generiert eine Wärmekarte/Matrix-Farbkarte.
Kapitel 3
: (3) Qt+QCustomPlot generiert Balkendiagramme (Säulendiagramme) mit Auf- und Abwärtsrichtung/verschiedenen Farben.
Kapitel 4: (4) Beispielentwicklung für die dynamische Anzeige eines QCustomPlot-Säulendiagramms



Vorwort

In Fortsetzung des vorherigen Artikels sind die Daten eines im vorherigen Artikel implementierten Säulendiagramms festgelegt, und die Daten können nicht über die Simulationsschaltfläche erhöht werden, und die Datenmenge ist gering, was die im tatsächlichen Projekt erforderlichen Funktionen nicht widerspiegeln kann. Daher werden in diesem Artikel die Daten simuliert und vergrößert, die Schnittstelle kann dynamisch angezeigt werden und das Diagramm kann auch zum Neuzeichnen freigegeben werden. Eine detaillierte Funktionsrealisierung finden Sie im Artikelinhalt. Sie können ihn zum Studium heranziehen . Sollte es Fehler geben, können Sie diese gerne kritisieren und korrigieren. .

Projekteffekt
Bitte fügen Sie eine Bildbeschreibung hinzu


提示:以下是本篇文章正文内容,下面案例可供参考

1. Verbesserung von QCustomPlot

Dieser Artikel fügt der UI-Schnittstelle zwei Widget-Steuerelemente hinzu und aktualisiert sie auf die QCustomPlot-Klasse. Die spezifischen Upgrade-Schritte finden Sie in diesem Blog: Gemeinsame Eigenschaftseinstellung von QCustomPlot, Zeichnen mehrerer Kurven, Zeichnen dynamischer Kurven, Cursorgenerierung, Vergrößern von Rechtecken und andere Funktionen.
Bitte fügen Sie eine Bildbeschreibung hinzu

Da es mehrere QCustomPlots auf der Schnittstelle gibt, müssen wir diese beiden Steuerelemente in unserem Konstruktor initialisieren. Die Hintergründe der beiden Steuerelemente sind gleich, daher verwenden wir hier eine setBarCustomPlot()-Funktion, um Eingabeparameter zu übergeben. Um die Initialisierung abzuschließen Zwei Steuerelemente finden Sie im vollständigen Code des Beispiels unten.

void Widget::initWidget()
{
    
    
	...
	m_customPlot = new QCustomPlot();
    m_customPlot = ui->customplot;
    setBarCustomPlot(m_customPlot,0);

    m_customPlot_2 = new QCustomPlot();
    m_customPlot_2 = ui->customplot_2;
    setBarCustomPlot(m_customPlot_2,1);
    ...

2. Beispiel für eine vollständige Codeanzeige

Der vollständige Code des Beispiels wird hier gezeigt. Weitere Informationen finden Sie im Codekommentar
1.widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "CustomPlot/qcustomplot.h"

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    
    
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void initWidget();
    void setBarCustomPlot(QCustomPlot *customPlot,int index);
    void setBarReplot(QCustomPlot *customPlot);

protected:
    bool eventFilter(QObject *watched,QEvent *event);

private slots:
    void on_pb_Start_clicked();
    void on_pb_Replot_clicked();
    void on_pb_Change_clicked();

private:
    Ui::Widget *ui;

    QCustomPlot *m_customPlot;
    QCustomPlot *m_customPlot_2;
    QCPItemText *maxLabel[2];
    QCPItemText *minLabel[2];

    int serialNum;
    double maxNum;
    double minNum;
    double xNum;
    double yNum;
};
#endif // WIDGET_H

2.widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);
    this->initWidget();
}

Widget::~Widget()
{
    
    
    delete m_customPlot;
    delete ui;
}

void Widget::initWidget()
{
    
    
    //初始化变量
    serialNum = 0;
    maxNum = 0;
    minNum = 0;
    xNum = 0;
    yNum = 0;

    m_customPlot = new QCustomPlot();
    m_customPlot = ui->customplot;
    setBarCustomPlot(m_customPlot,0);

    m_customPlot_2 = new QCustomPlot();
    m_customPlot_2 = ui->customplot_2;
    setBarCustomPlot(m_customPlot_2,1);

    //添加事件过滤器
    ui->customplot->installEventFilter(this);
    ui->customplot_2->installEventFilter(this);
}

void Widget::setBarCustomPlot(QCustomPlot *customPlot,int index)
{
    
    
    //qDebug()<<"*customPlot:"<<customPlot->objectName();

    //设置背景黑色
    customPlot->axisRect()->setBackground(QBrush(Qt::black));

    //x轴设置
    customPlot->xAxis->setVisible(true);
    customPlot->xAxis->setTickLabels(false);
    customPlot->xAxis->setSubTickLength(0);
    customPlot->xAxis->setTickLength(0);
    customPlot->xAxis->setRange(0,30);

    //x2轴设置
    customPlot->xAxis2->setVisible(true);
    customPlot->xAxis2->setTickLabels(false);
    customPlot->xAxis2->setSubTickLength(0);
    customPlot->xAxis2->setTickLength(0);

    //y轴设置
    customPlot->yAxis->setVisible(true);
    customPlot->yAxis->setTickLabels(false);
    customPlot->yAxis->setSubTickLength(0);
    customPlot->yAxis->setTickLength(0);
    customPlot->yAxis->setRange(-1.6,1.6);
    customPlot->yAxis->ticker()->setTickCount(3);
    customPlot->yAxis->grid()->setPen(QPen(Qt::white));

    //y2轴设置
    customPlot->yAxis2->setVisible(true);
    customPlot->yAxis2->setTickLabels(false);
    customPlot->yAxis2->setSubTickLength(0);
    customPlot->yAxis2->setTickLength(0);

    //设置文本框
    maxLabel[index] = new QCPItemText(customPlot);   //在QCustomplot中新建文字框
    maxLabel[index]->position->setType(QCPItemPosition::ptAxisRectRatio);   //位置类型
    maxLabel[index]->position->setCoords(0.96,0.18);
    maxLabel[index]->setText("   ");
    maxLabel[index]->setColor(QColor(Qt::white));   //字体颜色
    maxLabel[index]->setFont(QFont(font().family(),8));   //字体大小
    maxLabel[index]->setBrush(QColor(Qt::red));
    maxLabel[index]->setPadding(QMargins(2,2,2,2));   //文字距离边框几个像素

    minLabel[index] = new QCPItemText(customPlot);
    minLabel[index]->position->setType(QCPItemPosition::ptAxisRectRatio);
    minLabel[index]->position->setCoords(0.96,0.82);
    minLabel[index]->setText("   ");
    minLabel[index]->setColor(QColor(Qt::white));
    minLabel[index]->setFont(QFont(font().family(),8));
    minLabel[index]->setBrush(QColor(Qt::red));
    minLabel[index]->setPadding(QMargins(2,2,2,2));

}

void Widget::setBarReplot(QCustomPlot *customPlot)
{
    
    
    QCPBars *bars = new QCPBars(customPlot->xAxis,customPlot->yAxis);
    bars->setAntialiased(false);   //为了更好的边框效果,关闭抗齿锯
    bars->setWidth(1);   //设置各柱之前无间隔
    bars->setPen(QPen(QColor(Qt::black).lighter(100)));   //设置柱状图的边框颜色
    qDebug()<<"maxNum:"<<maxNum<<"   minNum:"<<minNum;

    if((yNum>minNum*0.8)&&(yNum<maxNum*0.8))
    {
    
    
        bars->setBrush(QColor(Qt::green));//绿色
    }
    else if((yNum<minNum)||(yNum>maxNum))
    {
    
    
        bars->setBrush(QColor(Qt::red));//红色
    }
    else
    {
    
    
        bars->setBrush(QColor(Qt::yellow));//黄色
    }

    QVector<double> ticks1;
    ticks1 << xNum;
    QVector<double> fossilData1;
    fossilData1  << yNum;
    bars->setData(ticks1,fossilData1,true);

    if(xNum > 30)
    {
    
    
        customPlot->xAxis->setRange(xNum-29.5,xNum+0.5);
    }

    customPlot->replot(QCustomPlot::rpQueuedReplot);
}

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    
    
    if(event->type() == QEvent::MouseButtonDblClick)   //双击图表事件
    {
    
    
        if(watched == ui->customplot)
        {
    
    
            qDebug()<<"customplot doubleClicked";
        }
        else if(watched == ui->customplot_2)
        {
    
    
            qDebug()<<"customplot_2 doubleClicked";
        }
    }
    return QWidget::eventFilter(watched,event);
}

void Widget::on_pb_Start_clicked()
{
    
    
    //maxLabel[0]->setText("-1.11");
    //minLabel[0]->setText("-1.11");
    maxLabel[0]->setText(QString::number(maxNum,'f',2));
    minLabel[0]->setText(QString::number(minNum,'f',2));
    maxLabel[1]->setText(QString::number(maxNum,'f',2));
    minLabel[1]->setText(QString::number(minNum,'f',2));

    serialNum ++;
    qDebug()<<"serialNum:"<<serialNum;
    xNum = serialNum - 0.5;
    if(yNum < 1.5)
    {
    
    
        yNum += 0.1;
    }
    else
    {
    
    
        yNum = -1.5;
    }
    qDebug()<<"xNum:"<<xNum<<"   yNum:"<<yNum;

    setBarReplot(m_customPlot);
    setBarReplot(m_customPlot_2);
}

void Widget::on_pb_Replot_clicked()
{
    
    
    //清除数据
    serialNum = 0;
    maxNum = 0;
    minNum = 0;
    xNum = 0;
    yNum = 0;
    maxLabel[0]->setText("   ");
    minLabel[0]->setText("   ");
    maxLabel[1]->setText("   ");
    minLabel[1]->setText("   ");
    m_customPlot->xAxis->setRange(0,30);
    m_customPlot->clearPlottables();
    m_customPlot->replot(QCustomPlot::rpQueuedReplot);
    m_customPlot_2->xAxis->setRange(0,30);
    m_customPlot_2->clearPlottables();
    m_customPlot_2->replot(QCustomPlot::rpQueuedReplot);
}

void Widget::on_pb_Change_clicked()
{
    
    
    //设置文本框
    maxNum = 1.00;
    minNum = -1.00;
    maxLabel[0]->setText(QString::number(maxNum,'f',2));
    minLabel[0]->setText(QString::number(minNum,'f',2));
    maxLabel[1]->setText(QString::number(maxNum,'f',2));
    minLabel[1]->setText(QString::number(minNum,'f',2));
    m_customPlot->replot(QCustomPlot::rpQueuedReplot);
    m_customPlot_2->replot(QCustomPlot::rpQueuedReplot);
}

3. widget.ui siehe oben.


3. Download-Link

Mein Beispiel-Link zur Baidu-Netzwerkfestplatte: https://pan.baidu.com/s/1IAHCmKt4x14oef_09kD0Gg
Extraktionscode: xxcj

Zusammenfassen

Der Test ergab, dass die gleichzeitige Anzeige mehrerer QCustomPlots ebenfalls sehr reibungslos ist und nicht zum Einfrieren der Schnittstelle führt. Der Schlüssel zur Realisierung der dynamischen Anzeige der Schnittstelle in diesem Artikel ist der Code customPlot->xAxis->setRange(xNum- 29,5,xNum+0,5), jeder Sie können den X-Achsenbereich des Diagramms entsprechend der tatsächlichen Situation ändern. Bei der tatsächlichen Arbeit kann es auch vorkommen, dass Sie auf die QCustomPlot-Schnittstelle klicken, um andere Funktionen zu realisieren. Zu diesem Zeitpunkt können Sie die Verwendung der Methode des Ereignisfilters in Betracht ziehen. In diesem Artikel wird das Umschreiben von Ereignissen durch Doppelklicken auf das Diagramm neu geschrieben, was möglich ist entsprechend den Anforderungen des Projekts geändert werden.

Der vorherige Artikel in dieser Reihe: (3) Qt+QCustomPlot generiert Balkendiagramme (Säulendiagramme) mit Auf- und Abwärtsrichtung/verschiedenen Farben

Hallo:
Gemeinsam lernen und gemeinsam Fortschritte machen. Wenn Sie noch Fragen dazu haben, können Sie im Kommentarbereich eine Nachricht zur Diskussion hinterlassen.

Acho que você gosta

Origin blog.csdn.net/XCJandLL/article/details/127885968
Recomendado
Clasificación