diff --git a/src/legend/legendmarkeritem.cpp b/src/legend/legendmarkeritem.cpp index efc3dc5..5a5460e 100644 --- a/src/legend/legendmarkeritem.cpp +++ b/src/legend/legendmarkeritem.cpp @@ -39,9 +39,18 @@ LegendMarkerItem::LegendMarkerItem(QLegendMarkerPrivate *marker, QGraphicsObject m_rectItem(new QGraphicsRectItem(this)), m_margin(4), m_space(4), + m_hovering(false), m_pressPos(0, 0) { m_rectItem->setRect(m_markerRect); + setAcceptsHoverEvents(true); +} + +LegendMarkerItem::~LegendMarkerItem() +{ + if (m_hovering) { + emit m_marker->q_ptr->hovered(false); + } } void LegendMarkerItem::setPen(const QPen &pen) @@ -160,6 +169,21 @@ QSizeF LegendMarkerItem::sizeHint(Qt::SizeHint which, const QSizeF& constraint) return sh; } +void LegendMarkerItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +{ + Q_UNUSED(event) + m_hovering = true; + emit m_marker->q_ptr->hovered(true); +} + +void LegendMarkerItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +{ + Q_UNUSED(event) + m_hovering = false; + emit m_marker->q_ptr->hovered(false); +} + + #include "moc_legendmarkeritem_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/legend/legendmarkeritem_p.h b/src/legend/legendmarkeritem_p.h index bdf8f51..f56a67c 100644 --- a/src/legend/legendmarkeritem_p.h +++ b/src/legend/legendmarkeritem_p.h @@ -48,6 +48,7 @@ class LegendMarkerItem : public QGraphicsObject, public QGraphicsLayoutItem Q_INTERFACES(QGraphicsLayoutItem) public: explicit LegendMarkerItem(QLegendMarkerPrivate *marker, QGraphicsObject *parent = 0); + ~LegendMarkerItem(); void setPen(const QPen &pen); QPen pen() const; @@ -70,6 +71,9 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); QSizeF sizeHint (Qt::SizeHint which, const QSizeF &constraint) const; + void hoverEnterEvent(QGraphicsSceneHoverEvent *event); + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + protected: QLegendMarkerPrivate *m_marker; // Knows QRectF m_markerRect; @@ -84,7 +88,7 @@ protected: QFont m_font; QPen m_pen; QBrush m_brush; - bool m_visible; + bool m_hovering; QPointF m_pressPos; diff --git a/tests/auto/qlegend/tst_qlegend.cpp b/tests/auto/qlegend/tst_qlegend.cpp index 50bbb7e..f7816ce 100644 --- a/tests/auto/qlegend/tst_qlegend.cpp +++ b/tests/auto/qlegend/tst_qlegend.cpp @@ -58,6 +58,7 @@ private slots: void areaMarkerProperties(); void xyMarkerPropertiesLine(); void xyMarkerPropertiesScatter(); + void markerSignals(); private: @@ -479,6 +480,71 @@ void tst_QLegend::xyMarkerPropertiesScatter() TRY_COMPARE(pm->isVisible(), true); } +void tst_QLegend::markerSignals() +{ + SKIP_IF_CANNOT_TEST_MOUSE_EVENTS(); + QChart *chart = new QChart(); + QLegend *legend = chart->legend(); + + QBarSeries *bar = new QBarSeries(); + QBarSet *set1 = new QBarSet(QString("set 1")); + *set1 << 10 << 10 << 10; + bar->append(set1); + QBarSet *set2 = new QBarSet(QString("set 2")); + *set2 << 10 << 10 << 10; + bar->append(set2); + chart->addSeries(bar); + + QPieSeries *pie = new QPieSeries(); + pie->append(QString("slice1"), 1); + pie->append(QString("slice2"), 2); + pie->append(QString("slice3"), 3); + chart->addSeries(pie); + legend->setAlignment(Qt::AlignRight); + + QLineSeries *line = new QLineSeries(); + line->setName(QString("Line 1")); + line->append(1,1); + chart->addSeries(line); + + QAreaSeries *area = new QAreaSeries(); + area->setName(QString("Area 1")); + QLineSeries *upper = new QLineSeries(); + QLineSeries *lower = new QLineSeries(); + upper->append(2,2); + lower->append(1,1); + area->setUpperSeries(upper); + area->setLowerSeries(lower); + chart->addSeries(area); + + QScatterSeries *scatter = new QScatterSeries(); + scatter->setName(QString("Scatter")); + scatter->append(3,3); + chart->addSeries(scatter); + + QList spies; + foreach(QLegendMarker *m, legend->markers()) { + QSignalSpy *spy = new QSignalSpy(m, SIGNAL(hovered(bool))); + spies.append(spy); + } + + QChartView view(chart); + view.resize(400,300); + view.show(); + QTest::qWaitForWindowShown(&view); + + // Sweep mouse over all legend items + for ( int i = 0; i < 300; i++ ) { + QTest::mouseMove(view.viewport(), QPoint(333,i)); + } + + foreach(QSignalSpy *spy, spies) { + TRY_COMPARE(spy->count(), 2); + } + + qDeleteAll(spies); +} + QTEST_MAIN(tst_QLegend) #include "tst_qlegend.moc"