diff --git a/doc/images/examples_populationpyramid.png b/doc/images/examples_populationpyramid.png new file mode 100644 index 0000000000000000000000000000000000000000..985ad4578b0680ccb3ba9fed3fb4d9d8d28057a8 GIT binary patch literal 30852 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 F{};dQAcFt^ literal 0 Hc$@Model data
  • Bar chart from model
  • Percent bar chart
  • +
  • Population pyramid
  • Pie chart
  • Donut chart
  • Pie chart drilldown
  • diff --git a/examples/populationpyramid/main.cpp b/examples/populationpyramid/main.cpp index 658e0f7..67f3ad9 100644 --- a/examples/populationpyramid/main.cpp +++ b/examples/populationpyramid/main.cpp @@ -37,7 +37,7 @@ int main(int argc, char *argv[]) QBarSet *male = new QBarSet("Male"); QBarSet *female = new QBarSet("Female"); - // From wikipedia + // Not really negative population. Negated values are used to grow bar to left. *male << -145596 << -149894 << -167327 << -164118 << -170710 << -169408 << -158395 << -176975 << -191803 << -191198 << -196815 << -207826 << -145517 << -113204 << -90986 << -70909 << -40013 << -15887 << -5769; @@ -51,14 +51,13 @@ int main(int argc, char *argv[]) series->append(male); series->append(female); series->setBarWidth(0.5); - series->setGrouping(false); + series->setOverlap(true); //![2] //![3] QChart* chart = new QChart(); chart->addSeries(series); chart->setTitle("Population of Finland in 2005 by age group"); - chart->createDefaultAxes(); chart->setAnimationOptions(QChart::SeriesAnimations); //![3] @@ -69,6 +68,7 @@ int main(int argc, char *argv[]) QBarCategoryAxis* axis = new QBarCategoryAxis(); axis->append(categories); + chart->createDefaultAxes(); chart->setAxisY(axis,series); chart->axisX(series)->setRange(-210000,210000); //![4] @@ -86,7 +86,7 @@ int main(int argc, char *argv[]) //![7] QMainWindow window; window.setCentralWidget(chartView); - window.resize(400, 800); + window.resize(400, 600); window.show(); //![7] diff --git a/src/barchart/horizontal/bar/horizontalbarchartitem.cpp b/src/barchart/horizontal/bar/horizontalbarchartitem.cpp index a4e21ca..68650a4 100644 --- a/src/barchart/horizontal/bar/horizontalbarchartitem.cpp +++ b/src/barchart/horizontal/bar/horizontalbarchartitem.cpp @@ -49,10 +49,10 @@ QVector HorizontalBarChartItem::calculateLayout() qreal barHeight; // On horizontal chart barWidth of the barseries means height of the rect. - if (m_series->d_func()->m_grouping) { - barHeight = (scaleY / setCount) * m_series->d_func()->barWidth(); - } else { + if (m_series->d_func()->m_overlap) { barHeight = scaleY * m_series->d_func()->barWidth(); + } else { + barHeight = (scaleY / setCount) * m_series->d_func()->barWidth(); } int itemIndex(0); @@ -62,11 +62,11 @@ QVector HorizontalBarChartItem::calculateLayout() QBarSetPrivate* barSet = m_series->d_func()->barsetAt(set)->d_ptr.data(); qreal yPos = m_rect.bottom() + (m_domainMinY - barSet->pos(category)) * scaleY; - if (m_series->d_func()->m_grouping) { + if (m_series->d_func()->m_overlap) { + yPos += barHeight/2; + } else { yPos += setCount*barHeight/2; yPos -= set*barHeight; - } else { - yPos += barHeight/2; } qreal barWidth = barSet->value(category) * scaleX; diff --git a/src/barchart/qabstractbarseries.cpp b/src/barchart/qabstractbarseries.cpp index bca0da1..9bb59a3 100644 --- a/src/barchart/qabstractbarseries.cpp +++ b/src/barchart/qabstractbarseries.cpp @@ -386,14 +386,15 @@ bool QAbstractBarSeries::isLabelsVisible() const } /*! - Sets the grouped drawing mode for bars. If \a grouping is true, then the bars + Sets the overlap drawing mode for bars. If \a overlap is true, then the bars are drawn at same position inside group. Can be used for example to draw negative bars - at same position on axis than positive bars. + at same position on axis than positive bars. By default overlap is false and bars are drawn + next to each other. Note that this setting doesn't affect stacked and percent bar series. */ -void QAbstractBarSeries::setGrouping(bool grouping) +void QAbstractBarSeries::setOverlap(bool overlap) { Q_D(QAbstractBarSeries); - d->setGrouping(grouping); + d->setOverlap(overlap); } @@ -405,7 +406,7 @@ QAbstractBarSeriesPrivate::QAbstractBarSeriesPrivate(QAbstractBarSeries *q) : m_barWidth(0.5), // Default value is 50% of category width m_labelsVisible(false), m_visible(true), - m_grouping(true) + m_overlap(false) { } @@ -453,10 +454,10 @@ void QAbstractBarSeriesPrivate::setLabelsVisible(bool visible) emit labelsVisibleChanged(visible); } -void QAbstractBarSeriesPrivate::setGrouping(bool grouping) +void QAbstractBarSeriesPrivate::setOverlap(bool overlap) { - if (m_grouping != grouping) { - m_grouping = grouping; + if (m_overlap != overlap) { + m_overlap = overlap; emit updatedBars(); } } diff --git a/src/barchart/qabstractbarseries.h b/src/barchart/qabstractbarseries.h index e9586d9..601ebfc 100644 --- a/src/barchart/qabstractbarseries.h +++ b/src/barchart/qabstractbarseries.h @@ -59,7 +59,7 @@ public: void setLabelsVisible(bool visible = true); bool isLabelsVisible() const; - void setGrouping(bool grouping = true); + void setOverlap(bool overlap = true); protected: explicit QAbstractBarSeries(QAbstractBarSeriesPrivate &d,QObject *parent = 0); diff --git a/src/barchart/qabstractbarseries_p.h b/src/barchart/qabstractbarseries_p.h index 7c419b6..0835f43 100644 --- a/src/barchart/qabstractbarseries_p.h +++ b/src/barchart/qabstractbarseries_p.h @@ -52,7 +52,7 @@ public: void setVisible(bool visible); void setLabelsVisible(bool visible); - void setGrouping(bool grouping); + void setOverlap(bool overlap); void scaleDomain(Domain& domain); ChartElement* createGraphics(ChartPresenter* presenter); @@ -92,7 +92,7 @@ protected: qreal m_barWidth; bool m_labelsVisible; bool m_visible; - bool m_grouping; + bool m_overlap; private: Q_DECLARE_PUBLIC(QAbstractBarSeries) diff --git a/src/barchart/vertical/bar/barchartitem.cpp b/src/barchart/vertical/bar/barchartitem.cpp index 579fb44..0839b71 100644 --- a/src/barchart/vertical/bar/barchartitem.cpp +++ b/src/barchart/vertical/bar/barchartitem.cpp @@ -50,10 +50,10 @@ QVector BarChartItem::calculateLayout() qreal scaleX = (width / rangeX); qreal barWidth; - if (m_series->d_func()->m_grouping) { - barWidth = (scaleX / setCount) * m_series->d_func()->barWidth(); - } else { + if (m_series->d_func()->m_overlap) { barWidth = scaleX * m_series->d_func()->barWidth(); + } else { + barWidth = (scaleX / setCount) * m_series->d_func()->barWidth(); } int itemIndex(0); @@ -64,12 +64,12 @@ QVector BarChartItem::calculateLayout() qreal xPos; - if (m_series->d_func()->m_grouping) { + if (m_series->d_func()->m_overlap) { + xPos = (barSet->pos(category) - m_domainMinX) * scaleX + m_rect.left() - barWidth/2; + } else { xPos = (barSet->pos(category) - m_domainMinX) * scaleX + m_rect.left(); xPos -= setCount*barWidth/2; xPos += set*barWidth; - } else { - xPos = (barSet->pos(category) - m_domainMinX) * scaleX + m_rect.left() - barWidth/2; } qreal barHeight = barSet->value(category) * scaleY;