Qt QChart 动态曲线(二)

鼠标悬停时显示坐标点:

代码如下:(重写QChartView类)

pro文件:
QT       += charts

重写QChartView_t.h文件
#ifndef QCHARTVIEW_T_H
#define QCHARTVIEW_T_H

#include <QObject>
#include <QChartView>
#include <QMouseEvent>
#include <QtCharts/QChartView>

QT_CHARTS_USE_NAMESPACE

class QChartView_t :public QChartView
{
    Q_OBJECT
public:
    QChartView_t(QChart *chart, QWidget *parent=nullptr);

    void mouseMoveEvent(QMouseEvent *event) override;

    double getX() const;

    double getY() const;

private:
    double x;
    double y;
};

#endif // QCHARTVIEW_T_H

重写QChartView_t.cpp文件
#include "qchartview_t.h"

#include <QDebug>

QChartView_t::QChartView_t(QChart *chart, QWidget *parent)
{
    this->setChart(chart);
}

void QChartView_t::mouseMoveEvent(QMouseEvent *event)
{
    x = this->chart()->mapToValue(event->pos()).x();
    y = this->chart()->mapToValue(event->pos()).y();

    //防止父类的实例收不到事件
    QChartView::mouseMoveEvent(event);
}

double QChartView_t::getX() const
{
    return x;
}

double QChartView_t::getY() const
{
    return y;
}

h文件:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QChart>
//#include <QChartView>
#include <QSplineSeries>
#include <QDateTimeAxis>
#include <QValueAxis>
#include <QTimer>
#include <QDateTime>

#include "qchartview_t.h"

QT_CHARTS_USE_NAMESPACE

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void DrawLine();

private:
    Ui::Widget *ui;

    QTimer *timer;
    QChart *chart;
    QSplineSeries *series;
    QValueAxis *axisX;
    QValueAxis *axisY;
    QChartView_t *chartView;

    qreal m_x;
};
#endif // WIDGET_H

cpp文件:
#include "widget.h"
#include "ui_widget.h"

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

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(DrawLine()));

    QPen penY(Qt::darkBlue,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
    chart = new QChart();
    series = new QSplineSeries;
    axisX = new QValueAxis();
    axisY = new QValueAxis();

    chart->legend()->hide();                             //隐藏图例
    chart->addSeries(series);                            //把线添加到chart
    axisX->setTickCount(5);                             //设置坐标轴格数
    axisX->setRange(0, 10);
    axisX->setTitleText("实时时间");                       //设置X轴名称
    axisX->setLinePen(penY);
    axisY->setTickCount(5);
    axisY->setRange(0, 10); //设置Y轴范围
    axisY->setLinePen(penY);
    axisY->setTitleText("Y");

    chart->addAxis(axisX,Qt::AlignBottom);               //设置坐标轴位于chart中的位置
    chart->addAxis(axisY,Qt::AlignLeft);

    series->attachAxis(axisX);                           //把数据添加到坐标轴上
    series->attachAxis(axisY);

    //把chart显示到窗口上
    chartView = new QChartView_t(chart);
    chartView->setRenderHint(QPainter::Antialiasing);//使曲线看着更顺滑

    QHBoxLayout *layout = new QHBoxLayout();
    layout->addWidget(chartView);

    ui->widget->setLayout(layout);

    timer->start();
    timer->setInterval(1000);    //设置定时周期

    m_x = 0;
}

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

void Widget::DrawLine()
{   
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));                          //这里生成随机数做测试
    //增加新的点到曲线末端
    series->append(m_x, qrand() % 9);

    m_x++;

    if(m_x > 10) {
//        chart->scroll(axisX->tickCount(), 0);     //x轴坐标变化,显示区域固定
        axisX->setRange(0, m_x);                    //x轴坐标零点起,范围增加
    }

    QString str = "x = " + QString::number(chartView->getX()) + "\ny = " + QString::number(chartView->getY());

    ui->widget->setToolTip(str);
}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值