QChart笔记6:显示点的值、显示点坐标值

QChart笔记2: 添加鼠标悬停显示和格式处理_qchart 折线图 响应鼠标显示数据-CSDN博客上修改而来。

在笔记2中,通过鼠标悬停的方式显示了坐标轴Y的值,如果要一直显示应该怎么写呢?比如要达到下面的效果。

核心是这句:

series1->setPointLabelsFormat("@yPoint");

pointLabelsFormat :                   

用于显示带有数据点的标签的格式。

QXYSeries 支持以下格式标签:

@xPoint:数据点的 x 坐标。
@yPoint:数据点的 y 坐标。
例如,格式标记的以下用法将生成显示数据点的标签,这些数据点显示在用逗号 (x, y) 分隔的括号内:

series->setPointLabelsFormat("(@xPoint, @yPoint)");
默认情况下,标签的格式设置为@xPoint、@yPoint。标签显示在绘图区域上,绘图区域边缘的标签被剪切。如果这些点彼此靠近,则标签可能会重叠。

相关的函数:

QString

pointLabelsFormat() const

void

setPointLabelsFormat(const QString &format)

通知信号:

void

pointLabelsFormatChanged(const QString &format)

源码:

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QMainWindow>
#include <QChartView>
#include <QPieSeries>
#include <QPieSlice>
#include <QPointF>
#include <QDateTime>
#include <QDate>
#include <QDateTimeAxis>
#include <QDebug>
#include <QSplineSeries>
#include <QToolTip>
#include <QtCharts>

#include "chartview.h"

QChart *chart;
QSplineSeries *series1;
ChartView *chartView;
QScatterSeries *scatterSeries;
void initChart()
{
    //初始化QChart的实例
    chart = new QChart();

    //初始化QSplineSeries的实例
    series1 = new QSplineSeries();
    //设置两条折线的名称
    series1->setName("第一组");

    //把曲线添加到QChart的实例chart中
    chart->addSeries(series1);

    chart->legend()->hide();
    //声明并初始化X轴、两个Y轴
    QDateTimeAxis *axisX = new QDateTimeAxis();
    QValueAxis *axisY_1 = new QValueAxis();
    //设置坐标轴显示的范围
    axisX->setMin(QDateTime(QDate(2022, 6, 6), QTime()));
    axisX->setMax(QDateTime(QDate(2022, 6, 12), QTime()));
    axisX->setTickCount(7);
    axisX->setFormat(QString("yyyy-MM-dd"));
    axisY_1->setMin(0);
    axisY_1->setMax(250);


    //设置坐标轴上的格点
    axisY_1->setTickCount(6);

    //设置坐标轴的颜色,粗细,设置网格
    axisY_1->setLinePenColor(QColor(Qt::darkCyan));
    axisX->setLinePenColor(QColor(Qt::darkCyan));

    axisY_1->setGridLineVisible(true);
    axisY_1->setGridLineColor(QColor(Qt::darkGray));
    axisX->setGridLineVisible(false);


    //把坐标轴添加到chart中,
    //addAxis函数的第二个参数是设置坐标轴的位置,
    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY_1, Qt::AlignLeft);


    //把曲线关联到坐标轴
    series1->attachAxis(axisX);
    series1->attachAxis(axisY_1);

    series1->setPointsVisible(true);
    series1->setPointLabelsVisible();
    series1->setPointLabelsFormat("@yPoint");


    chartView = new ChartView(chart);
    chartView->setChart(chart);
    chartView->setRenderHint(QPainter::Antialiasing);


    QObject::connect(series1, SIGNAL(hovered(const QPointF&,bool)), chartView, SLOT(showPos(const QPointF&, bool)));

}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    initChart();



    QDateTime atnowtime = QDateTime(QDate(2022, 6, 6), QTime());
    series1->append(atnowtime.toMSecsSinceEpoch(), 94.4496);
    QDateTime atnowtime2 = QDateTime(QDate(2022, 6, 7), QTime());
    series1->append(atnowtime2.toMSecsSinceEpoch(), 238.3);
    QDateTime atnowtime3 = QDateTime(QDate(2022, 6, 8), QTime());
    series1->append(atnowtime3.toMSecsSinceEpoch(), 214.5);
    QDateTime atnowtime4 = QDateTime(QDate(2022, 6, 9), QTime());
    series1->append(atnowtime4.toMSecsSinceEpoch(), 226);
    QDateTime atnowtime5 = QDateTime(QDate(2022, 6, 10), QTime());
    series1->append(atnowtime5.toMSecsSinceEpoch(), 209);
    QDateTime atnowtime6 = QDateTime(QDate(2022, 6, 11), QTime());
    series1->append(atnowtime6.toMSecsSinceEpoch(), 137);
    QDateTime atnowtime7 = QDateTime(QDate(2022, 6, 12), QTime());
    series1->append(atnowtime7.toMSecsSinceEpoch(), 90);


    MainWindow w;
    w.setCentralWidget(chartView);

    w.show();
    return a.exec();
}

chartview.h chartview.cpp

#ifndef CHARTVIEW_H
#define CHARTVIEW_H
#include <QtCharts>

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


public slots:
    void showPos(const QPointF&, bool);

};


#endif // CHARTVIEW_H


#include "chartview.h"
#include <QDebug>

ChartView::ChartView(QChart *chart, QWidget *parent) : QChartView(chart, parent)
{

}

void ChartView::showPos(const QPointF& point, bool state)
{
    QPointF tempPoint(point.x(), point.y());

    QList<double> yList;
    for (int i=0; i<static_cast<QSplineSeries*>(this->chart()->series().at(0))->points().size(); ++i)
    {
        yList.append(static_cast<QSplineSeries*>(this->chart()->series().at(0))->points().at(i).y());
    }

    double y = point.y();
    if (state)
    {
        for (int i=0; i<yList.count(); ++i)
        {
            if (qFabs(yList.at(i) - y) <= 5)
            {
                QToolTip::showText(QCursor::pos(), QString("%1").arg(yList.at(i)));
                break;
            }
        }
    }
}

如果想同时显示X,Y的值,这样设置

series1->setPointLabelsFormat("@xPoint, @yPoint");

由于这个程序的横轴坐标格式化成了日期,所以显示的效果并不理想。

具体怎么解决这个问题还在探索中。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值