鼠标悬停时显示坐标点:
代码如下:(重写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);
}