##// END OF EJS Templates
QSplineSeries calculateControlPoints moved to splinechartitem. This way we don't need to deal with controlPoints on logaritmic scale
QSplineSeries calculateControlPoints moved to splinechartitem. This way we don't need to deal with controlPoints on logaritmic scale

File last commit:

r2358:9d5a354692be
r2372:d6a999e30ac3
Show More
callout.cpp
102 lines | 3.5 KiB | text/x-c | CppLexer
Marek Rosa
Added callout example (Drawing on top of chart)
r2150 #include "callout.h"
#include <QPainter>
#include <QFontMetrics>
#include <QGraphicsSceneMouseEvent>
Marek Rosa
Updated callout example
r2346 #include <QMouseEvent>
Marek Rosa
Added callout example (Drawing on top of chart)
r2150
Callout::Callout(QGraphicsItem * parent):
QGraphicsItem(parent)
{
}
QRectF Callout::boundingRect() const
{
QPointF anchor = mapFromParent(m_anchor);
QRectF rect;
rect.setLeft(qMin(m_textRect.left(), anchor.x()));
Marek Rosa
Mapping functions added to QChart. Callout example updated
r2344 rect.setRight(qMax(m_textRect.right() + 8, anchor.x()));
Marek Rosa
Added callout example (Drawing on top of chart)
r2150 rect.setTop(qMin(m_textRect.top(), anchor.y()));
Marek Rosa
Mapping functions added to QChart. Callout example updated
r2344 rect.setBottom(qMax(m_textRect.bottom() + 8, anchor.y()));
Marek Rosa
Added callout example (Drawing on top of chart)
r2150 return rect;
}
void Callout::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option)
Q_UNUSED(widget)
QPainterPath path;
path.addRoundedRect(m_textRect, 5, 5);
QPointF anchor = mapFromParent(m_anchor);
if (!m_textRect.contains(anchor)) {
QPointF point1, point2;
// establish the position of the anchor point in relation to m_textRect
bool above = anchor.y() <= m_textRect.top();
bool aboveCenter = anchor.y() > m_textRect.top() && anchor.y() <= m_textRect.center().y();
bool belowCenter = anchor.y() > m_textRect.center().y() && anchor.y() <= m_textRect.bottom();
bool below = anchor.y() > m_textRect.bottom();
bool onLeft = anchor.x() <= m_textRect.left();
bool leftOfCenter = anchor.x() > m_textRect.left() && anchor.x() <= m_textRect.center().x();
bool rightOfCenter = anchor.x() > m_textRect.center().x() && anchor.x() <= m_textRect.right();
bool onRight = anchor.x() > m_textRect.right();
// get the nearest m_textRect corner.
qreal x = (onRight + rightOfCenter) * m_textRect.width();
qreal y = (below + belowCenter) * m_textRect.height();
bool cornerCase = (above && onLeft) || (above && onRight) || (below && onLeft) || (below && onRight);
bool vertical = qAbs(anchor.x() - x) > qAbs(anchor.y() - y);
qreal x1 = x + leftOfCenter * 10 - rightOfCenter * 20 + cornerCase * !vertical * (onLeft * 10 - onRight * 20);
qreal y1 = y + aboveCenter * 10 - belowCenter * 20 + cornerCase * vertical * (above * 10 - below * 20);;
point1.setX(x1);
point1.setY(y1);
qreal x2 = x + leftOfCenter * 20 - rightOfCenter * 10 + cornerCase * !vertical * (onLeft * 20 - onRight * 10);;
qreal y2 = y + aboveCenter * 20 - belowCenter * 10 + cornerCase * vertical * (above * 20 - below * 10);;
point2.setX(x2);
point2.setY(y2);
path.moveTo(point1);
path.lineTo(mapFromParent(m_anchor));
path.lineTo(point2);
path = path.simplified();
}
painter->setBrush(QColor(255, 255, 255));
painter->drawPath(path);
Marek Rosa
Mapping functions added to QChart. Callout example updated
r2344 painter->drawText(m_textRect.adjusted(4, 4, 0, 0), m_text);
Marek Rosa
Added callout example (Drawing on top of chart)
r2150 }
void Callout::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (m_textRect.contains(event->pos())) {
m_clickOffset = event->pos();
event->setAccepted(true);
} else {
event->setAccepted(false);
}
}
void Callout::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (m_textRect.contains(event->pos())){
setPos(mapToParent(event->pos() - m_clickOffset));
event->setAccepted(true);
} else {
event->setAccepted(false);
}
}
void Callout::setText(const QString &text)
{
m_text = text;
QFontMetrics metrics(m_font);
prepareGeometryChange();
m_textRect = metrics.boundingRect(QRect(0, 0, 150, 150), Qt::AlignLeft, m_text).adjusted(0, 0, 4, 4);
}
void Callout::setAnchor(QPointF point)
{
m_anchor = point;
}