diff --git a/examples/callout/callout.cpp b/examples/callout/callout.cpp index 337ed5d..5a26da3 100644 --- a/examples/callout/callout.cpp +++ b/examples/callout/callout.cpp @@ -14,9 +14,9 @@ QRectF Callout::boundingRect() const QPointF anchor = mapFromParent(m_anchor); QRectF rect; rect.setLeft(qMin(m_textRect.left(), anchor.x())); - rect.setRight(qMax(m_textRect.right() + 4, anchor.x())); + rect.setRight(qMax(m_textRect.right() + 8, anchor.x())); rect.setTop(qMin(m_textRect.top(), anchor.y())); - rect.setBottom(qMax(m_textRect.bottom() + 4, anchor.y())); + rect.setBottom(qMax(m_textRect.bottom() + 8, anchor.y())); return rect; } @@ -65,7 +65,7 @@ void Callout::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q } painter->setBrush(QColor(255, 255, 255)); painter->drawPath(path); - painter->drawText(m_textRect.adjusted(2, 2, 0, 0), m_text); + painter->drawText(m_textRect.adjusted(4, 4, 0, 0), m_text); } void Callout::mousePressEvent(QGraphicsSceneMouseEvent *event) diff --git a/examples/callout/widget.cpp b/examples/callout/widget.cpp index 5b72280..d0ac439 100644 --- a/examples/callout/widget.cpp +++ b/examples/callout/widget.cpp @@ -73,9 +73,10 @@ void Widget::tooltip(QPointF point, bool state) m_tooltip = new Callout(m_chart); if (state) { - m_tooltip->setText(QString("X: %1\nY: %2").arg(point.x()).arg(point.y())); - m_tooltip->setAnchor(m_chart->mapFromParent(m_view->mapToScene(m_view->mapFromGlobal(QCursor::pos())))); - m_tooltip->setPos(m_chart->mapFromParent(m_view->mapToScene(m_view->mapFromGlobal(QCursor::pos() + QPoint(10, -50))))); + m_tooltip->setText(QString("X: %1 \nY: %2 ").arg(point.x()).arg(point.y())); + QXYSeries *series = qobject_cast(sender()); + m_tooltip->setAnchor(m_chart->mapToPosition(point, series)); + m_tooltip->setPos(m_chart->mapToPosition(point, series) + QPoint(10, -50)); m_tooltip->setZValue(11); m_tooltip->show(); } else { diff --git a/src/chartdataset.cpp b/src/chartdataset.cpp index 0c79603..8323248 100644 --- a/src/chartdataset.cpp +++ b/src/chartdataset.cpp @@ -385,6 +385,28 @@ void ChartDataSet::scrollDomain(qreal dx, qreal dy) domain->blockRangeSignals(false); } +QPointF ChartDataSet::mapToValue(const QPointF &position, QAbstractSeries *series) +{ + QPointF point; + if (series == 0 && !m_seriesList.isEmpty()) + series = m_seriesList.first(); + + if (series && m_seriesList.contains(series)) + point = series->d_ptr->m_domain->calculateDomainPoint(position); + return point; +} + +QPointF ChartDataSet::mapToPosition(const QPointF &value, QAbstractSeries *series) +{ + QPointF point = m_chart->plotArea().topLeft(); + if (series == 0 && !m_seriesList.isEmpty()) + series = m_seriesList.first(); + + if (series && m_seriesList.contains(series)) + point += series->d_ptr->m_domain->calculateGeometryPoint(value); + return point; +} + QList ChartDataSet::axes() const { return m_axisList; diff --git a/src/chartdataset_p.h b/src/chartdataset_p.h index e39879e..939e5d7 100644 --- a/src/chartdataset_p.h +++ b/src/chartdataset_p.h @@ -64,6 +64,9 @@ public: void zoomOutDomain(const QRectF &rect); void scrollDomain(qreal dx, qreal dy); + QPointF mapToValue(const QPointF &position, QAbstractSeries *series = 0); + QPointF mapToPosition(const QPointF &value, QAbstractSeries *series = 0); + Q_SIGNALS: void axisAdded(QAbstractAxis* axis); void axisRemoved(QAbstractAxis* axis); diff --git a/src/qchart.cpp b/src/qchart.cpp index c4067bf..9c1547b 100644 --- a/src/qchart.cpp +++ b/src/qchart.cpp @@ -269,7 +269,7 @@ void QChart::zoomIn() */ void QChart::zoomIn(const QRectF &rect) { - d_ptr->zoomIn(rect); + d_ptr->zoomIn(rect); } /*! @@ -347,11 +347,11 @@ QAbstractAxis *QChart::axisY(QAbstractSeries *series) const foreach(QAbstractAxis* axis, axes){ if(axis->alignment()==Qt::AlignLeft){ - left=axis; + left=axis; } if(axis->alignment()==Qt::AlignRight){ - right=axis; + right=axis; } } @@ -540,16 +540,16 @@ QList QChart::series() const */ void QChart::setAxisX(QAbstractAxis *axis , QAbstractSeries *series) { - QList list = axes(Qt::Horizontal,series); + QList list = axes(Qt::Horizontal,series); - foreach(QAbstractAxis* a, list){ + foreach(QAbstractAxis* a, list){ d_ptr->m_dataset->removeAxis(a); delete a; - } + } - if(!d_ptr->m_dataset->axes().contains(axis)) - d_ptr->m_dataset->addAxis(axis,Qt::AlignBottom); - d_ptr->m_dataset->attachAxis(series,axis); + if(!d_ptr->m_dataset->axes().contains(axis)) + d_ptr->m_dataset->addAxis(axis,Qt::AlignBottom); + d_ptr->m_dataset->attachAxis(series,axis); } /*! @@ -567,18 +567,28 @@ void QChart::setAxisY(QAbstractAxis *axis , QAbstractSeries *series) } if(!d_ptr->m_dataset->axes().contains(axis)) - d_ptr->m_dataset->addAxis(axis,Qt::AlignLeft); + d_ptr->m_dataset->addAxis(axis,Qt::AlignLeft); d_ptr->m_dataset->attachAxis(series,axis); } void QChart::addAxis(QAbstractAxis *axis,Qt::Alignment aligment) { - d_ptr->m_dataset->addAxis(axis,aligment); + d_ptr->m_dataset->addAxis(axis,aligment); } void QChart::removeAxis(QAbstractAxis *axis) { - d_ptr->m_dataset->removeAxis(axis); + d_ptr->m_dataset->removeAxis(axis); +} + +QPointF QChart::mapToValue(const QPointF &position, QAbstractSeries *series) +{ + return d_ptr->m_dataset->mapToValue(position, series); +} + +QPointF QChart::mapToPosition(const QPointF &value, QAbstractSeries *series) +{ + return d_ptr->m_dataset->mapToPosition(value, series); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -617,7 +627,7 @@ void QChartPrivate::zoomIn(qreal factor) void QChartPrivate::zoomIn(const QRectF &rect) { if (!rect.isValid()) - return; + return; QRectF r = rect.normalized(); const QRectF geometry = m_presenter->geometry(); diff --git a/src/qchart.h b/src/qchart.h index af87c25..6fdd97a 100644 --- a/src/qchart.h +++ b/src/qchart.h @@ -130,6 +130,9 @@ public: QRectF plotArea() const; + QPointF mapToValue(const QPointF &position, QAbstractSeries *series = 0); + QPointF mapToPosition(const QPointF &value, QAbstractSeries *series = 0); + protected: QScopedPointer d_ptr; friend class QLegend;