在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");
由于这个程序的横轴坐标格式化成了日期,所以显示的效果并不理想。
具体怎么解决这个问题还在探索中。