diff --git a/doc/images/scatter_example1.jpg b/doc/images/scatter_example1.jpg index 3e95f07c821e092a4a6bac0715971dbc602898c1..17ea2dabb55c3aa6cbe96459711225aa1a28ebfb 100644 GIT binary patch literal 12405 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 literal 11172 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 diff --git a/doc/images/scatter_example_custom.jpg b/doc/images/scatter_example_custom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9f3252df0e058daaf5b1be8712c5874df6eb39a GIT binary patch literal 12317 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 literal 0 Hc$@^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-126YBCW=16jCP7AKLB{__7^D~&n3$LukO9!Oj7;o6Ib8t;CPrpv zCKeWUs1zemDT^Shq9L1*uw!7MsM5lVDn^No8xMX2DwkwrU}gk)91fU)CNVGpr4$8$ zwlJ~+Al_yW!n=?|HY`RPy^*X~(3WII=$8I3~+zW6G|dJv*1iZQ4F7V6BvKkDU3Z71yJB zFYcPq+3_}sjo~)i%#xeFS9|g`SSA?%dOOQncm`u=O~>KMb68jHbKl7AvU$!OjSLm$ zy_G?l+XLJE-nq`b;T>s6n0Y+q`jxp$9cIT?tL?Te iKC;bp@uL0D18#hkT-3G9^}DtJKU=y^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-125kmiW=16jCP7AKLB{__7^D~&n3zGXg#$)51{PL!W}uv@00R>v zGczMIJ1YYrmlY&{X_rQoOkcuem%{-J9X=vQxkR{lb6}XA#u>=vsZq8THlG^ zqEn_S>|_zV$8REQ*OnD@Js|#G^s6N8?6xkuqtO|mHq#R4Ierk~F+MfHQRULyjmMVW zcx=Ita>+gL)wD@jPAQc-toJvKgq*EYw?__hL1~o zi$XjWhN%eslo39_{zyZjD(M&N6}HC;Z-ujjr5QYxWge}Ht$cd_`RVtw)-Q}btopPk zazFK~4%eFL~Yagbmt4xtJ;SMYnTl7&`FvFaou5aZ{GzwV)0$=a>MB31 ko*TuVpHg@r((-T6hL^t@ogIJO;=lWDR{mM$pyvNK0sEceasU7T diff --git a/example/scatter/main.cpp b/example/scatter/main.cpp index ef2a47d..6e196de 100644 --- a/example/scatter/main.cpp +++ b/example/scatter/main.cpp @@ -13,40 +13,32 @@ int main(int argc, char *argv[]) //! [1] // Create chart view QChartView *chartView = new QChartView(); - chartView->setChartTheme(QChart::ChartThemeIcy); - // Add scatter series with simple test data + chartView->setRenderHint(QPainter::Antialiasing); + chartView->setChartTheme(QChart::ChartThemeScientific); + // Add scatter series with linear test data with random "noise" QScatterSeries *scatter = new QScatterSeries(); - *scatter << QPointF(0.5, 5.0) << QPointF(1.0, 4.5) << QPointF(1.0, 5.5) << QPointF(1.5, 5.0); + for (qreal i(0.0); i < 20; i += 0.25) { + qreal x = i + (qreal)(rand() % 100) / 100.0; + qreal y = i + (qreal)(rand() % 100) / 100.0; + (*scatter) << QPointF(x, y); + } // Chart takes ownership chartView->addSeries(scatter); //! [1] -// scatter->replace(0, QPointF(0.75, 5.0)); // And more - //! [3] - *scatter << QPointF(2.0, 5.5) << QPointF(2.2, 5.4); - //! [3] + //! [2] + //*scatter << QPointF(2.0, 5.5) << QPointF(2.2, 5.4); + //! [2] - // Add another scatter series (re-use the previous pointer because the code used as snippets - // in the docs) - // - more data with random component - scatter = new QScatterSeries(); - for (qreal i(0.0); i < 20; i += 0.15) { - (*scatter) << QPointF(i + (qreal)(rand() % 100) / 100.0, - i + (qreal)(rand() % 100) / 100.0); - } - //! [4] - QBrush brush(QColor(255, 0, 0, 100), Qt::SolidPattern); + //! [3] + QBrush brush(QColor(255, 0, 0, 80), Qt::SolidPattern); scatter->setBrush(brush); - //! [4] - //! [5] - QPen pen(QColor(0, 255, 0, 80), 3); + QPen pen(QColor(0, 255, 0, 60), 3); scatter->setPen(pen); - //! [5] - //! [6] scatter->setShape(QScatterSeries::MarkerShapeRectangle); - //! [6] - chartView->addSeries(scatter); + scatter->setSize(15.0); + //! [3] // Use the chart widget as the central widget QMainWindow w; diff --git a/src/scatterseries/qscatterseries.cpp b/src/scatterseries/qscatterseries.cpp index 6d354dd..241a779 100644 --- a/src/scatterseries/qscatterseries.cpp +++ b/src/scatterseries/qscatterseries.cpp @@ -14,6 +14,15 @@ The example code would result the following: \image scatter_example1.jpg + + To customize the graphical representation of the series, you can modify pen, brush, shape and + size of the marker items. For example: + + \snippet ../example/scatter/main.cpp 3 + + Would present your scatter markers as big rectangles with opaque, uglyish green outlines and + opaque red filling instead of the beatiful markers defined by the chart's theme: + \image scatter_example_custom.jpg */ /*! @@ -22,7 +31,6 @@ This enum describes the shape used when rendering marker items. \value MarkerShapeDefault - \value MarkerShapePoint \value MarkerShapeX \value MarkerShapeRectangle \value MarkerShapeTiltedRectangle @@ -53,7 +61,8 @@ QScatterSeriesPrivate::QScatterSeriesPrivate() : m_data(QList()), m_markerPen(QPen(QColor::Invalid)), m_markerBrush(QBrush(QColor::Invalid)), - m_markerShape(QScatterSeries::MarkerShapeDefault) + m_markerShape(QScatterSeries::MarkerShapeDefault), + m_markerSize(9.0) { } @@ -106,7 +115,7 @@ void QScatterSeries::add(QList points) \sa add() For example: - \snippet ../example/scatter/main.cpp 3 + \snippet ../example/scatter/main.cpp 2 */ QScatterSeries& QScatterSeries::operator << (const QPointF &value) { @@ -214,13 +223,6 @@ int QScatterSeries::closestPoint(QPointF coordinate) Overrides the default pen used for drawing a marker item with a user defined \a pen. The default pen is defined by chart theme setting. - For example: - \snippet ../example/scatter/main.cpp 5 - - Would present your scatter markers with an opaque, uglyish green outlines instead of the - beatiful markers defined by the chart's theme: - \image scatter_example_pen.jpg - \sa setBrush() \sa QChart::setChartTheme() */ @@ -241,12 +243,6 @@ QPen QScatterSeries::pen() Overrides the default brush of the marker items with a user defined \a brush. The default brush is defined by chart theme setting. - For example: - \snippet ../example/scatter/main.cpp 4 - - Would fill your scatter markers with an opaque red color: - \image scatter_example_brush.jpg - \sa setPen() \sa QChart::setChartTheme() */ @@ -266,12 +262,6 @@ QBrush QScatterSeries::brush() /*! Overrides the default shape of the marker items with a user defined \a shape. The default shape is defined by chart theme setting. - - For example: - \snippet ../example/scatter/main.cpp 6 - - Would make your scatter marker items rectangle: - \image scatter_example_shape.jpg */ void QScatterSeries::setShape(MarkerShape shape) { @@ -286,6 +276,23 @@ QScatterSeries::MarkerShape QScatterSeries::shape() return (QScatterSeries::MarkerShape) d->m_markerShape; } +/*! + Returns the size of the marker items. +*/ +qreal QScatterSeries::size() +{ + return d->m_markerSize; +} + +/*! + Set the \a size of the marker items. The default size is 9.0. +*/ +void QScatterSeries::setSize(qreal size) +{ + d->m_markerSize = size; + emit changed(); +} + #include "moc_qscatterseries.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/scatterseries/qscatterseries.h b/src/scatterseries/qscatterseries.h index 2c7ebf6..bd3176a 100644 --- a/src/scatterseries/qscatterseries.h +++ b/src/scatterseries/qscatterseries.h @@ -17,7 +17,6 @@ public: // TODO: to be defined by the graphics design // TODO: marker shapes: "x", star, rectangle, tilted rect, triangle, circle, dot MarkerShapeDefault = 0, - MarkerShapePoint, MarkerShapeX, MarkerShapeRectangle, MarkerShapeTiltedRectangle, @@ -53,7 +52,8 @@ public: void setBrush(QBrush brush); MarkerShape shape(); void setShape(MarkerShape shape); - // TODO: marker size? + qreal size(); + void setSize(qreal size); Q_SIGNALS: void clicked(QPointF coordinate); diff --git a/src/scatterseries/scatterpresenter.cpp b/src/scatterseries/scatterpresenter.cpp index 1470c85..1d61b15 100644 --- a/src/scatterseries/scatterpresenter.cpp +++ b/src/scatterseries/scatterpresenter.cpp @@ -113,7 +113,7 @@ void ScatterPresenter::changeGeometry() int shape = m_series->shape(); m_path = QPainterPath(); m_path.setFillRule(Qt::WindingFill); - const qreal size(9); // TODO: user defined size? + const qreal size = m_series->size(); foreach (QPointF point, m_series->data()) { // Convert relative coordinates to absolute pixel coordinates that can be used for drawing @@ -127,9 +127,6 @@ void ScatterPresenter::changeGeometry() case QScatterSeries::MarkerShapeCircle: m_path.addEllipse(x, y, size, size); break; - case QScatterSeries::MarkerShapePoint: - m_path.addEllipse(x, y, 2, 2); - break; case QScatterSeries::MarkerShapeRectangle: m_path.addRect(x, y, size, size); break; diff --git a/src/scatterseries/scatterseries_p.h b/src/scatterseries/scatterseries_p.h index 4518812..a46091b 100644 --- a/src/scatterseries/scatterseries_p.h +++ b/src/scatterseries/scatterseries_p.h @@ -20,6 +20,7 @@ public: QPen m_markerPen; QBrush m_markerBrush; int m_markerShape; + qreal m_markerSize; }; QTCOMMERCIALCHART_END_NAMESPACE