Как отметил Сохейм, формат меток точек, предоставляемый QtCharts, слишком ограничен для этого.
Если вы не хотите испачкать руки внутренностями QtCharts, вы можете решить свою проблему другим способом: Нарисуйте текстовые метки самостоятельно.
Извлекайте пользовательский графический элемент из QGraphicsObject
:
class PointLabelsItem : public QGraphicsObject
{
Q_OBJECT
public:
PointLabelsItem(QtCharts::QChart *parent = nullptr);
virtual QRectF boundingRect() const;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
public slots:
void setRect(const QRectF &area);
void setAxis(const QAbstractAxis *axis, Qt::Alignment alignment);
// setter for either source Q*Series or points / point labels
protected:
QRectF area;
// const axes*
// const series* or points/labels
};
В реализации:
PointLabelsItem::PointLabelsItem(QtCharts::QChart *parent)
: QGraphicsObject(parent)
{
setZValue(10); // put above series
connect(parent, &QtCharts::QChart::plotAreaChanged,
this, &PointLabelsItem::setRect);
}
QRectF PointLabelsItem::boundingRect() const
{
return area;
}
void PointLabelsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
// translate between data coordinates and scene coordinates
// by making use of `area` and the axes' ranges, OR via
// qobject_cast<QtCharts::QChart>(parent())->mapToPosition()
// then draw custom point label texts at the corresp. positions
}
void PointLabelsItem::setRect(const QRectF &newArea)
{
area = newArea;
update();
}
void setAxis(const QAbstractAxis *axis, Qt::Alignment alignment)
{
disconnect(/* old axis member variable */);
// set corresp. axis member variable here
connect(axis, &QtCharts::QValueAxis::rangeChanged, this, [this] { update(); });
}
Снаружи:
auto pointLabels = new PointLabelsItem(chart);
// set axes, series
Это скелет.
Вы также можете принять решение о том, чтобы QGRaphicsTextItem
s были детьми вашего PointLabelsItem
(т. Е. Членов, для которых this
установлено в качестве parent
). Таким образом, вы можете включить взаимодействие пользователя с метками.