我正在使用qt的qtcharts模块
我使用的是c++,但解决方案是否适用于另一种语言并不重要(我稍后会翻译它(
问题:我在QChart
中绘制了一堆QLineSeries
,并且只想在悬停时显示点标签。
我计划使用信号QXYSeries::hovered()
来检测鼠标何时移动到某个点上(鼠标离开该点时也是如此(。
我知道存在一个成员函数QXYSeries::setPointLabelsVisible()
,但它使序列的所有点都可见。
我希望一次只能显示一个点,因为序列相对较大,显示所有标签会降低可读性。
问题:是否可以只显示QLineSeries
的一个点标签?如果是,如何
我在Qt文档中找不到这样的功能。
以下是一个基线代码示例(为了方便起见(:
声明:
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
};
定义:
#include <QApplication>
#include <QLineSeries>
#include <QDateTimeAxis>
#include <QValueAxis>
#include <QChartView>
#include <QDateTime>
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
}
MainWindow::MainWindow()
{
setWindowTitle("QtCharts baseline");
resize(800, 500);
QtCharts::QChart * chart = new QtCharts::QChart;
chart->setTitle("Baseline sample");
chart->legend()->setAlignment(Qt::AlignRight);
QtCharts::QDateTimeAxis * time_axis = new QtCharts::QDateTimeAxis;
time_axis->setFormat("hh:mm:ss");
time_axis->setTitleText("Time");
time_axis->setTickCount(5);
QtCharts::QValueAxis * value_axis = new QtCharts::QValueAxis;
value_axis->setTitleText("Value (unit)");
value_axis->setTickCount(6);
chart->addAxis(time_axis, Qt::AlignBottom);
chart->addAxis(value_axis, Qt::AlignLeft);
QtCharts::QLineSeries * ls = new QtCharts::QLineSeries;
ls->setName("Test series");
ls->setPointsVisible(true);
//ls->setPointLabelsVisible(true);
QDateTime dt = QDateTime::currentDateTime();
ls->append(dt.toMSecsSinceEpoch(), -10);
ls->append(dt.addSecs(1).toMSecsSinceEpoch(), 8);
ls->append(dt.addSecs(2).toMSecsSinceEpoch(), 27);
ls->append(dt.addSecs(3).toMSecsSinceEpoch(), 12);
ls->append(dt.addSecs(4).toMSecsSinceEpoch(), 42);
chart->addSeries(ls);
ls->attachAxis(time_axis);
ls->attachAxis(value_axis);
QtCharts::QChartView * view = new QtCharts::QChartView;
view->setChart(chart);
this->setCentralWidget(view);
}
您可以尝试的一种技术是制作;影子;只有一个或几个点需要的线序列的副本,位于实际数据线的顶部。用透明笔绘制,这样线条就不会显示,但可以将标签设置为可见。您可以向线系列的阴影副本添加/删除/更改点,并且只有您想要绘制的标签才能添加到系列中。链接显示一个该技术的示例。