summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--examples/charts/areachart/main.cpp4
-rw-r--r--examples/charts/barchart/main.cpp14
-rw-r--r--examples/charts/barmodelmapper/tablewidget.cpp12
-rw-r--r--examples/charts/boxplotchart/main.cpp4
-rw-r--r--examples/charts/chartinteractions/chart.cpp4
-rw-r--r--examples/charts/chartinteractions/main.cpp7
-rw-r--r--examples/charts/chartthemes/themewidget.cpp41
-rw-r--r--examples/charts/customchart/main.cpp6
-rw-r--r--examples/charts/dynamicspline/chart.cpp20
-rw-r--r--examples/charts/dynamicspline/chart.h3
-rw-r--r--examples/charts/horizontalbarchart/main.cpp6
-rw-r--r--examples/charts/horizontalpercentbarchart/main.cpp12
-rw-r--r--examples/charts/horizontalstackedbarchart/main.cpp12
-rw-r--r--examples/charts/lineandbar/main.cpp10
-rw-r--r--examples/charts/percentbarchart/main.cpp12
-rw-r--r--examples/charts/scatterinteractions/chartview.cpp4
-rw-r--r--examples/charts/splinechart/main.cpp2
-rw-r--r--examples/charts/stackedbarchart/main.cpp12
-rw-r--r--examples/charts/stackedbarchartdrilldown/drilldownchart.cpp19
-rw-r--r--examples/charts/stackedbarchartdrilldown/drilldownchart.h7
-rw-r--r--examples/charts/stackedbarchartdrilldown/drilldownseries.cpp10
-rw-r--r--examples/charts/stackedbarchartdrilldown/drilldownseries.h5
-rw-r--r--examples/charts/stackedbarchartdrilldown/main.cpp6
-rw-r--r--examples/charts/temperaturerecords/main.cpp18
-rw-r--r--src/charts/axis/cartesianchartaxis.cpp43
-rw-r--r--src/charts/axis/chartaxiselement.cpp60
-rw-r--r--src/charts/axis/chartaxiselement_p.h11
-rw-r--r--src/charts/axis/horizontalaxis.cpp99
-rw-r--r--src/charts/axis/valueaxis/chartvalueaxisx.cpp86
-rw-r--r--src/charts/axis/valueaxis/chartvalueaxisx_p.h3
-rw-r--r--src/charts/axis/valueaxis/chartvalueaxisy.cpp80
-rw-r--r--src/charts/axis/valueaxis/chartvalueaxisy_p.h3
-rw-r--r--src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp4
-rw-r--r--src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp4
-rw-r--r--src/charts/axis/valueaxis/qvalueaxis.cpp99
-rw-r--r--src/charts/axis/valueaxis/qvalueaxis.h19
-rw-r--r--src/charts/axis/valueaxis/qvalueaxis_p.h6
-rw-r--r--src/charts/axis/verticalaxis.cpp99
-rw-r--r--src/charts/chartpresenter.cpp48
-rw-r--r--src/charts/chartpresenter_p.h5
-rw-r--r--src/charts/doc/snippets/doc_src_qmlcharts.cpp2
-rw-r--r--src/charts/doc/src/qtcharts.qdoc2
-rw-r--r--src/charts/layout/abstractchartlayout.cpp44
-rw-r--r--src/charts/layout/abstractchartlayout_p.h16
-rw-r--r--src/charts/layout/cartesianchartlayout.cpp9
-rw-r--r--src/charts/layout/cartesianchartlayout_p.h3
-rw-r--r--src/charts/layout/polarchartlayout.cpp10
-rw-r--r--src/charts/layout/polarchartlayout_p.h3
-rw-r--r--src/charts/linechart/linechartitem.cpp4
-rw-r--r--src/charts/qchart.cpp9
-rw-r--r--src/charts/qchart.h13
-rw-r--r--src/charts/qchartview.cpp7
-rw-r--r--src/charts/xychart/glxyseriesdata.cpp24
-rw-r--r--src/chartsqml2/chartsqml2.pro3
-rw-r--r--src/chartsqml2/chartsqml2_plugin.cpp12
-rw-r--r--src/chartsqml2/declarativechart.cpp9
-rw-r--r--src/chartsqml2/declarativechart_p.h3
-rw-r--r--src/chartsqml2/designer/qtcharts.metainfo32
-rw-r--r--src/chartsqml2/plugins.qmltypes186
-rw-r--r--tests/auto/qchart/tst_qchart.cpp19
-rw-r--r--tests/auto/qvalueaxis/tst_qvalueaxis.cpp38
62 files changed, 1021 insertions, 348 deletions
diff --git a/.qmake.conf b/.qmake.conf
index 76c202ab..097d8b94 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -1,3 +1,3 @@
load(qt_build_config)
-MODULE_VERSION = 5.11.2
+MODULE_VERSION = 5.12.0
diff --git a/examples/charts/areachart/main.cpp b/examples/charts/areachart/main.cpp
index 86fb4e45..1bed9770 100644
--- a/examples/charts/areachart/main.cpp
+++ b/examples/charts/areachart/main.cpp
@@ -70,8 +70,8 @@ int main(int argc, char *argv[])
chart->addSeries(series);
chart->setTitle("Simple areachart example");
chart->createDefaultAxes();
- chart->axisX()->setRange(0, 20);
- chart->axisY()->setRange(0, 10);
+ chart->axes(Qt::Horizontal).first()->setRange(0, 20);
+ chart->axes(Qt::Vertical).first()->setRange(0, 10);
//![4]
//![5]
diff --git a/examples/charts/barchart/main.cpp b/examples/charts/barchart/main.cpp
index 8463100f..adf5a8d8 100644
--- a/examples/charts/barchart/main.cpp
+++ b/examples/charts/barchart/main.cpp
@@ -34,6 +34,7 @@
#include <QtCharts/QBarSet>
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
+#include <QtCharts/QValueAxis>
QT_CHARTS_USE_NAMESPACE
@@ -75,10 +76,15 @@ int main(int argc, char *argv[])
//![4]
QStringList categories;
categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
- QBarCategoryAxis *axis = new QBarCategoryAxis();
- axis->append(categories);
- chart->createDefaultAxes();
- chart->setAxisX(axis, series);
+ QBarCategoryAxis *axisX = new QBarCategoryAxis();
+ axisX->append(categories);
+ chart->addAxis(axisX, Qt::AlignBottom);
+ series->attachAxis(axisX);
+
+ QValueAxis *axisY = new QValueAxis();
+ axisY->setRange(0,15);
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisY);
//![4]
//![5]
diff --git a/examples/charts/barmodelmapper/tablewidget.cpp b/examples/charts/barmodelmapper/tablewidget.cpp
index bca89d47..89680d2e 100644
--- a/examples/charts/barmodelmapper/tablewidget.cpp
+++ b/examples/charts/barmodelmapper/tablewidget.cpp
@@ -39,6 +39,7 @@
#include <QtCharts/QVBarModelMapper>
#include <QtWidgets/QHeaderView>
#include <QtCharts/QBarCategoryAxis>
+#include <QtCharts/QValueAxis>
QT_CHARTS_USE_NAMESPACE
@@ -97,10 +98,13 @@ TableWidget::TableWidget(QWidget *parent)
//! [6]
QStringList categories;
categories << "April" << "May" << "June" << "July" << "August";
- QBarCategoryAxis *axis = new QBarCategoryAxis();
- axis->append(categories);
- chart->createDefaultAxes();
- chart->setAxisX(axis, series);
+ QBarCategoryAxis *axisX = new QBarCategoryAxis();
+ axisX->append(categories);
+ chart->addAxis(axisX, Qt::AlignBottom);
+ series->attachAxis(axisX);
+ QValueAxis *axisY = new QValueAxis();
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisY);
//! [6]
//! [7]
diff --git a/examples/charts/boxplotchart/main.cpp b/examples/charts/boxplotchart/main.cpp
index 2bd45171..671b34cc 100644
--- a/examples/charts/boxplotchart/main.cpp
+++ b/examples/charts/boxplotchart/main.cpp
@@ -88,8 +88,8 @@ int main(int argc, char *argv[])
//! [5]
chart->createDefaultAxes();
- chart->axisY()->setMin(15.0);
- chart->axisY()->setMax(34.0);
+ chart->axes(Qt::Vertical).first()->setMin(15.0);
+ chart->axes(Qt::Horizontal).first()->setMax(34.0);
//! [5]
//! [6]
diff --git a/examples/charts/chartinteractions/chart.cpp b/examples/charts/chartinteractions/chart.cpp
index ca63a3de..a6d3b887 100644
--- a/examples/charts/chartinteractions/chart.cpp
+++ b/examples/charts/chartinteractions/chart.cpp
@@ -78,12 +78,12 @@ void Chart::handlePointMove(const QPoint &point)
//Get the x- and y axis to be able to convert the mapped
//coordinate point to the charts scale.
- QAbstractAxis *axisx = this->axisX();
+ QAbstractAxis *axisx = axes(Qt::Horizontal).first();
QValueAxis *haxis = 0;
if (axisx->type() == QAbstractAxis::AxisTypeValue)
haxis = qobject_cast<QValueAxis *>(axisx);
- QAbstractAxis *axisy = this->axisY();
+ QAbstractAxis *axisy = axes(Qt::Vertical).first();
QValueAxis *vaxis = 0;
if (axisy->type() == QAbstractAxis::AxisTypeValue)
vaxis = qobject_cast<QValueAxis *>(axisy);
diff --git a/examples/charts/chartinteractions/main.cpp b/examples/charts/chartinteractions/main.cpp
index 5b8bac5b..a6ffdd16 100644
--- a/examples/charts/chartinteractions/main.cpp
+++ b/examples/charts/chartinteractions/main.cpp
@@ -58,16 +58,17 @@ int main(int argc, char *argv[])
QPen p = series->pen();
p.setWidth(5);
series->setPen(p);
- chart->createDefaultAxes();
chart->setTitle("Drag'n drop to move data points");
QValueAxis *axisX = new QValueAxis();
- chart->setAxisX(axisX, series);
+ chart->addAxis(axisX, Qt::AlignBottom);
axisX->setRange(0, 20);
+ series->attachAxis(axisX);
QValueAxis *axisY = new QValueAxis();
- chart->setAxisY(axisY, series);
+ chart->addAxis(axisY, Qt::AlignLeft);
axisY->setRange(0, 13);
+ series->attachAxis(axisY);
QObject::connect(series, &QLineSeries::pressed, chart, &Chart::clickPoint);
diff --git a/examples/charts/chartthemes/themewidget.cpp b/examples/charts/chartthemes/themewidget.cpp
index 84ea8231..cbcdb5c9 100644
--- a/examples/charts/chartthemes/themewidget.cpp
+++ b/examples/charts/chartthemes/themewidget.cpp
@@ -198,10 +198,12 @@ QChart *ThemeWidget::createAreaChart() const
}
chart->createDefaultAxes();
- chart->axisX()->setRange(0, m_valueCount - 1);
- chart->axisY()->setRange(0, m_valueMax);
+ chart->axes(Qt::Horizontal).first()->setRange(0, m_valueCount - 1);
+ chart->axes(Qt::Vertical).first()->setRange(0, m_valueMax);
// Add space to label to add space between labels and axis
- static_cast<QValueAxis *>(chart->axisY())->setLabelFormat("%.1f ");
+ QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
+ Q_ASSERT(axisY);
+ axisY->setLabelFormat("%.1f ");
return chart;
}
@@ -222,9 +224,11 @@ QChart *ThemeWidget::createBarChart(int valueCount) const
chart->addSeries(series);
chart->createDefaultAxes();
- chart->axisY()->setRange(0, m_valueMax * 2);
+ chart->axes(Qt::Vertical).first()->setRange(0, m_valueMax * 2);
// Add space to label to add space between labels and axis
- static_cast<QValueAxis *>(chart->axisY())->setLabelFormat("%.1f ");
+ QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
+ Q_ASSERT(axisY);
+ axisY->setLabelFormat("%.1f ");
return chart;
}
@@ -251,12 +255,14 @@ QChart *ThemeWidget::createLineChart() const
//![3]
chart->createDefaultAxes();
- chart->axisX()->setRange(0, m_valueMax);
- chart->axisY()->setRange(0, m_valueCount);
+ chart->axes(Qt::Horizontal).first()->setRange(0, m_valueMax);
+ chart->axes(Qt::Vertical).first()->setRange(0, m_valueCount);
//![3]
//![4]
// Add space to label to add space between labels and axis
- static_cast<QValueAxis *>(chart->axisY())->setLabelFormat("%.1f ");
+ QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
+ Q_ASSERT(axisY);
+ axisY->setLabelFormat("%.1f ");
//![4]
return chart;
@@ -299,11 +305,13 @@ QChart *ThemeWidget::createSplineChart() const
}
chart->createDefaultAxes();
- chart->axisX()->setRange(0, m_valueMax);
- chart->axisY()->setRange(0, m_valueCount);
- // Add space to label to add space between labels and axis
- static_cast<QValueAxis *>(chart->axisY())->setLabelFormat("%.1f ");
+ chart->axes(Qt::Horizontal).first()->setRange(0, m_valueMax);
+ chart->axes(Qt::Vertical).first()->setRange(0, m_valueCount);
+ // Add space to label to add space between labels and axis
+ QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
+ Q_ASSERT(axisY);
+ axisY->setLabelFormat("%.1f ");
return chart;
}
@@ -324,11 +332,12 @@ QChart *ThemeWidget::createScatterChart() const
}
chart->createDefaultAxes();
- chart->axisX()->setRange(0, m_valueMax);
- chart->axisY()->setRange(0, m_valueCount);
+ chart->axes(Qt::Horizontal).first()->setRange(0, m_valueMax);
+ chart->axes(Qt::Vertical).first()->setRange(0, m_valueCount);
// Add space to label to add space between labels and axis
- static_cast<QValueAxis *>(chart->axisY())->setLabelFormat("%.1f ");
-
+ QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
+ Q_ASSERT(axisY);
+ axisY->setLabelFormat("%.1f ");
return chart;
}
diff --git a/examples/charts/customchart/main.cpp b/examples/charts/customchart/main.cpp
index fbba6031..2ddc45c4 100644
--- a/examples/charts/customchart/main.cpp
+++ b/examples/charts/customchart/main.cpp
@@ -120,8 +120,10 @@ int main(int argc, char *argv[])
axisY->append("fast", 30);
axisY->setRange(0, 30);
- chart->setAxisX(axisX, series);
- chart->setAxisY(axisY, series);
+ chart->addAxis(axisX, Qt::AlignBottom);
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisX);
+ series->attachAxis(axisY);
//![4]
//![5]
diff --git a/examples/charts/dynamicspline/chart.cpp b/examples/charts/dynamicspline/chart.cpp
index beba2513..d19b7f02 100644
--- a/examples/charts/dynamicspline/chart.cpp
+++ b/examples/charts/dynamicspline/chart.cpp
@@ -37,7 +37,8 @@
Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
QChart(QChart::ChartTypeCartesian, parent, wFlags),
m_series(0),
- m_axis(new QValueAxis),
+ m_axisX(new QValueAxis()),
+ m_axisY(new QValueAxis()),
m_step(0),
m_x(5),
m_y(1)
@@ -52,11 +53,14 @@ Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
m_series->append(m_x, m_y);
addSeries(m_series);
- createDefaultAxes();
- setAxisX(m_axis, m_series);
- m_axis->setTickCount(5);
- axisX()->setRange(0, 10);
- axisY()->setRange(-5, 10);
+
+ addAxis(m_axisX,Qt::AlignBottom);
+ addAxis(m_axisY,Qt::AlignLeft);
+ m_series->attachAxis(m_axisX);
+ m_series->attachAxis(m_axisY);
+ m_axisX->setTickCount(5);
+ m_axisX->setRange(0, 10);
+ m_axisY->setRange(-5, 10);
m_timer.start();
}
@@ -68,8 +72,8 @@ Chart::~Chart()
void Chart::handleTimeout()
{
- qreal x = plotArea().width() / m_axis->tickCount();
- qreal y = (m_axis->max() - m_axis->min()) / m_axis->tickCount();
+ qreal x = plotArea().width() / m_axisX->tickCount();
+ qreal y = (m_axisX->max() - m_axisX->min()) / m_axisX->tickCount();
m_x += y;
m_y = QRandomGenerator::global()->bounded(5) - 2.5;
m_series->append(m_x, m_y);
diff --git a/examples/charts/dynamicspline/chart.h b/examples/charts/dynamicspline/chart.h
index 66a0ab8c..954a0946 100644
--- a/examples/charts/dynamicspline/chart.h
+++ b/examples/charts/dynamicspline/chart.h
@@ -55,7 +55,8 @@ private:
QTimer m_timer;
QSplineSeries *m_series;
QStringList m_titles;
- QValueAxis *m_axis;
+ QValueAxis *m_axisX;
+ QValueAxis *m_axisY;
qreal m_step;
qreal m_x;
qreal m_y;
diff --git a/examples/charts/horizontalbarchart/main.cpp b/examples/charts/horizontalbarchart/main.cpp
index 4cc35488..98198758 100644
--- a/examples/charts/horizontalbarchart/main.cpp
+++ b/examples/charts/horizontalbarchart/main.cpp
@@ -78,9 +78,11 @@ int main(int argc, char *argv[])
categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
QBarCategoryAxis *axisY = new QBarCategoryAxis();
axisY->append(categories);
- chart->setAxisY(axisY, series);
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisY);
QValueAxis *axisX = new QValueAxis();
- chart->setAxisX(axisX, series);
+ chart->addAxis(axisX, Qt::AlignBottom);
+ series->attachAxis(axisX);
axisX->applyNiceNumbers();
//![4]
diff --git a/examples/charts/horizontalpercentbarchart/main.cpp b/examples/charts/horizontalpercentbarchart/main.cpp
index ff4180c8..da636c1a 100644
--- a/examples/charts/horizontalpercentbarchart/main.cpp
+++ b/examples/charts/horizontalpercentbarchart/main.cpp
@@ -35,6 +35,7 @@
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QHorizontalPercentBarSeries>
+#include <QtCharts/QValueAxis>
QT_CHARTS_USE_NAMESPACE
@@ -76,10 +77,13 @@ int main(int argc, char *argv[])
//![4]
QStringList categories;
categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
- QBarCategoryAxis *axis = new QBarCategoryAxis();
- axis->append(categories);
- chart->createDefaultAxes();
- chart->setAxisY(axis, series);
+ QBarCategoryAxis *axisY = new QBarCategoryAxis();
+ axisY->append(categories);
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisY);
+ QValueAxis *axisX = new QValueAxis();
+ chart->addAxis(axisX, Qt::AlignBottom);
+ series->attachAxis(axisX);
//![4]
//![5]
diff --git a/examples/charts/horizontalstackedbarchart/main.cpp b/examples/charts/horizontalstackedbarchart/main.cpp
index 312a5fff..dd0f7578 100644
--- a/examples/charts/horizontalstackedbarchart/main.cpp
+++ b/examples/charts/horizontalstackedbarchart/main.cpp
@@ -35,6 +35,7 @@
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QHorizontalStackedBarSeries>
+#include <QtCharts/QValueAxis>
QT_CHARTS_USE_NAMESPACE
@@ -76,10 +77,13 @@ int main(int argc, char *argv[])
//![4]
QStringList categories;
categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
- QBarCategoryAxis *axis = new QBarCategoryAxis();
- axis->append(categories);
- chart->createDefaultAxes();
- chart->setAxisY(axis, series);
+ QBarCategoryAxis *axisY = new QBarCategoryAxis();
+ axisY->append(categories);
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisY);
+ QValueAxis *axisX = new QValueAxis();
+ chart->addAxis(axisX, Qt::AlignBottom);
+ series->attachAxis(axisX);
//![4]
//![5]
diff --git a/examples/charts/lineandbar/main.cpp b/examples/charts/lineandbar/main.cpp
index be267307..f2370997 100644
--- a/examples/charts/lineandbar/main.cpp
+++ b/examples/charts/lineandbar/main.cpp
@@ -89,13 +89,15 @@ int main(int argc, char *argv[])
categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
QBarCategoryAxis *axisX = new QBarCategoryAxis();
axisX->append(categories);
- chart->setAxisX(axisX, lineseries);
- chart->setAxisX(axisX, barseries);
+ chart->addAxis(axisX, Qt::AlignBottom);
+ lineseries->attachAxis(axisX);
+ barseries->attachAxis(axisX);
axisX->setRange(QString("Jan"), QString("Jun"));
QValueAxis *axisY = new QValueAxis();
- chart->setAxisY(axisY, lineseries);
- chart->setAxisY(axisY, barseries);
+ chart->addAxis(axisY, Qt::AlignLeft);
+ lineseries->attachAxis(axisY);
+ barseries->attachAxis(axisY);
axisY->setRange(0, 20);
//![4]
diff --git a/examples/charts/percentbarchart/main.cpp b/examples/charts/percentbarchart/main.cpp
index 34946fb4..38ef3f3f 100644
--- a/examples/charts/percentbarchart/main.cpp
+++ b/examples/charts/percentbarchart/main.cpp
@@ -34,6 +34,7 @@
#include <QtCharts/QBarSet>
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
+#include <QtCharts/QValueAxis>
QT_CHARTS_USE_NAMESPACE
@@ -74,10 +75,13 @@ int main(int argc, char *argv[])
//![4]
QStringList categories;
categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
- QBarCategoryAxis *axis = new QBarCategoryAxis();
- axis->append(categories);
- chart->createDefaultAxes();
- chart->setAxisX(axis, series);
+ QBarCategoryAxis *axisX = new QBarCategoryAxis();
+ axisX->append(categories);
+ chart->addAxis(axisX, Qt::AlignBottom);
+ series->attachAxis(axisX);
+ QValueAxis *axisY = new QValueAxis();
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisY);
//![4]
//![5]
diff --git a/examples/charts/scatterinteractions/chartview.cpp b/examples/charts/scatterinteractions/chartview.cpp
index 9c2e8da3..85c859a2 100644
--- a/examples/charts/scatterinteractions/chartview.cpp
+++ b/examples/charts/scatterinteractions/chartview.cpp
@@ -54,8 +54,8 @@ ChartView::ChartView(QWidget *parent)
chart()->addSeries(m_scatter2);
chart()->addSeries(m_scatter);
chart()->createDefaultAxes();
- chart()->axisX()->setRange(0, 4.5);
- chart()->axisY()->setRange(0, 4.5);
+ chart()->axes(Qt::Horizontal).first()->setRange(0, 4.5);
+ chart()->axes(Qt::Vertical).first()->setRange(0, 4.5);
connect(m_scatter, &QScatterSeries::clicked, this, &ChartView::handleClickedPoint);
}
diff --git a/examples/charts/splinechart/main.cpp b/examples/charts/splinechart/main.cpp
index db3a9324..b1fbb232 100644
--- a/examples/charts/splinechart/main.cpp
+++ b/examples/charts/splinechart/main.cpp
@@ -58,7 +58,7 @@ int main(int argc, char *argv[])
chart->addSeries(series);
chart->setTitle("Simple spline chart example");
chart->createDefaultAxes();
- chart->axisY()->setRange(0, 10);
+ chart->axes(Qt::Vertical).first()->setRange(0, 10);
//![3]
//![4]
diff --git a/examples/charts/stackedbarchart/main.cpp b/examples/charts/stackedbarchart/main.cpp
index f25d3ee6..6294f844 100644
--- a/examples/charts/stackedbarchart/main.cpp
+++ b/examples/charts/stackedbarchart/main.cpp
@@ -34,6 +34,7 @@
#include <QtCharts/QBarSet>
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
+#include <QtCharts/QValueAxis>
QT_CHARTS_USE_NAMESPACE
@@ -74,10 +75,13 @@ int main(int argc, char *argv[])
//![4]
QStringList categories;
categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
- QBarCategoryAxis *axis = new QBarCategoryAxis();
- axis->append(categories);
- chart->createDefaultAxes();
- chart->setAxisX(axis, series);
+ QBarCategoryAxis *axisX = new QBarCategoryAxis();
+ axisX->append(categories);
+ chart->addAxis(axisX, Qt::AlignBottom);
+ series->attachAxis(axisX);
+ QValueAxis *axisY = new QValueAxis();
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisY);
//![4]
//![5]
diff --git a/examples/charts/stackedbarchartdrilldown/drilldownchart.cpp b/examples/charts/stackedbarchartdrilldown/drilldownchart.cpp
index 2af737d2..696b5397 100644
--- a/examples/charts/stackedbarchartdrilldown/drilldownchart.cpp
+++ b/examples/charts/stackedbarchartdrilldown/drilldownchart.cpp
@@ -29,13 +29,18 @@
#include "drilldownchart.h"
#include <QtCharts/QBarCategoryAxis>
+#include <QtCharts/QValueAxis>
QT_CHARTS_USE_NAMESPACE
DrilldownChart::DrilldownChart(QGraphicsItem *parent, Qt::WindowFlags wFlags)
: QChart(QChart::ChartTypeCartesian, parent, wFlags),
- m_currentSeries(0)
+ m_currentSeries(0),
+ m_axisX(new QBarCategoryAxis()),
+ m_axisY(new QValueAxis())
{
+ addAxis(m_axisY, Qt::AlignLeft);
+ addAxis(m_axisX, Qt::AlignBottom);
}
void DrilldownChart::changeSeries(DrilldownBarSeries *series)
@@ -46,15 +51,11 @@ void DrilldownChart::changeSeries(DrilldownBarSeries *series)
m_currentSeries = series;
// Reset axis
- QBarCategoryAxis *axis = new QBarCategoryAxis();
- axis->append(m_currentSeries->categories());
-
+ m_axisX->setCategories(m_currentSeries->categories());
addSeries(series);
-
- createDefaultAxes();
- setAxisX(axis, series);
- axisY()->setTitleText("Crops");
-
+ series->attachAxis(m_axisX);
+ series->attachAxis(m_axisY);
+ m_axisY->setRange(0,m_currentSeries->maxValue());
setTitle(series->name());
}
diff --git a/examples/charts/stackedbarchartdrilldown/drilldownchart.h b/examples/charts/stackedbarchartdrilldown/drilldownchart.h
index 61725f17..7544bae5 100644
--- a/examples/charts/stackedbarchartdrilldown/drilldownchart.h
+++ b/examples/charts/stackedbarchartdrilldown/drilldownchart.h
@@ -33,6 +33,11 @@
#include <QtCharts/QChart>
#include "drilldownseries.h"
+namespace QtCharts {
+class QBarCategoryAxis;
+class QValueAxis;
+}
+
QT_CHARTS_USE_NAMESPACE
//! [1]
@@ -49,6 +54,8 @@ public Q_SLOTS:
private:
DrilldownBarSeries *m_currentSeries;
+ QBarCategoryAxis *m_axisX;
+ QValueAxis *m_axisY;
};
//! [1]
diff --git a/examples/charts/stackedbarchartdrilldown/drilldownseries.cpp b/examples/charts/stackedbarchartdrilldown/drilldownseries.cpp
index 80efd2c8..e5c143c9 100644
--- a/examples/charts/stackedbarchartdrilldown/drilldownseries.cpp
+++ b/examples/charts/stackedbarchartdrilldown/drilldownseries.cpp
@@ -31,8 +31,9 @@
QT_CHARTS_USE_NAMESPACE
-DrilldownBarSeries::DrilldownBarSeries(QStringList categories, QObject *parent)
- : QStackedBarSeries(parent)
+DrilldownBarSeries::DrilldownBarSeries(QStringList categories, int maxValue, QObject *parent)
+ : QStackedBarSeries(parent),
+ m_maxValue(maxValue)
{
m_categories = categories;
}
@@ -52,4 +53,9 @@ QStringList DrilldownBarSeries::categories()
return m_categories;
}
+int DrilldownBarSeries::maxValue()
+{
+ return m_maxValue;
+}
+
#include "moc_drilldownseries.cpp"
diff --git a/examples/charts/stackedbarchartdrilldown/drilldownseries.h b/examples/charts/stackedbarchartdrilldown/drilldownseries.h
index 1d0ec193..7cd28f0a 100644
--- a/examples/charts/stackedbarchartdrilldown/drilldownseries.h
+++ b/examples/charts/stackedbarchartdrilldown/drilldownseries.h
@@ -40,7 +40,7 @@ class DrilldownBarSeries : public QStackedBarSeries
{
Q_OBJECT
public:
- DrilldownBarSeries(QStringList categories, QObject *parent = 0);
+ DrilldownBarSeries(QStringList categories, int maxValue, QObject *parent = 0);
void mapDrilldownSeries(int index, DrilldownBarSeries *drilldownSeries);
@@ -48,9 +48,12 @@ public:
QStringList categories();
+ int maxValue();
+
private:
QMap<int, DrilldownBarSeries *> m_DrilldownSeries;
QStringList m_categories;
+ int m_maxValue;
};
//! [1]
diff --git a/examples/charts/stackedbarchartdrilldown/main.cpp b/examples/charts/stackedbarchartdrilldown/main.cpp
index 87035aea..c86bd0c3 100644
--- a/examples/charts/stackedbarchartdrilldown/main.cpp
+++ b/examples/charts/stackedbarchartdrilldown/main.cpp
@@ -63,14 +63,14 @@ int main(int argc, char *argv[])
//! [3]
// Create drilldown structure
- DrilldownBarSeries *seasonSeries = new DrilldownBarSeries(months, drilldownChart);
+ DrilldownBarSeries *seasonSeries = new DrilldownBarSeries(months, 320, drilldownChart);
seasonSeries->setName("Crop by month - Season");
// Each month in season series has drilldown series for weekly data
for (int month = 0; month < months.count(); month++) {
// Create drilldown series for every week
- DrilldownBarSeries *weeklySeries = new DrilldownBarSeries(weeks, drilldownChart);
+ DrilldownBarSeries *weeklySeries = new DrilldownBarSeries(weeks, 80, drilldownChart);
seasonSeries->mapDrilldownSeries(month, weeklySeries);
// Drilling down from weekly data brings us back to season data.
@@ -112,7 +112,7 @@ int main(int argc, char *argv[])
//! [5]
//! [6]
- drilldownChart->axisX()->setGridLineVisible(false);
+ drilldownChart->axes(Qt::Horizontal).first()->setGridLineVisible(false);
drilldownChart->legend()->setVisible(true);
drilldownChart->legend()->setAlignment(Qt::AlignBottom);
//! [6]
diff --git a/examples/charts/temperaturerecords/main.cpp b/examples/charts/temperaturerecords/main.cpp
index b521dee7..92508b58 100644
--- a/examples/charts/temperaturerecords/main.cpp
+++ b/examples/charts/temperaturerecords/main.cpp
@@ -35,6 +35,7 @@
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QStackedBarSeries>
+#include <QtCharts/QValueAxis>
QT_CHARTS_USE_NAMESPACE
@@ -70,13 +71,16 @@ int main(int argc, char *argv[])
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
- QBarCategoryAxis *axis = new QBarCategoryAxis();
- axis->append(categories);
- axis->setTitleText("Month");
- chart->createDefaultAxes();
- chart->setAxisX(axis, series);
- chart->axisY(series)->setRange(-52, 52);
- chart->axisY(series)->setTitleText("Temperature [&deg;C]");
+ QBarCategoryAxis *axisX = new QBarCategoryAxis();
+ axisX->append(categories);
+ axisX->setTitleText("Month");
+ chart->addAxis(axisX, Qt::AlignBottom);
+ QValueAxis *axisY = new QValueAxis();
+ axisY->setRange(-52, 52);
+ axisY->setTitleText("Temperature [&deg;C]");
+ chart->addAxis(axisY, Qt::AlignLeft);
+ series->attachAxis(axisX);
+ series->attachAxis(axisY);
//![4]
//![5]
diff --git a/src/charts/axis/cartesianchartaxis.cpp b/src/charts/axis/cartesianchartaxis.cpp
index 0dcb4860..dbee904f 100644
--- a/src/charts/axis/cartesianchartaxis.cpp
+++ b/src/charts/axis/cartesianchartaxis.cpp
@@ -107,8 +107,47 @@ void CartesianChartAxis::updateMinorTickItems()
int expectedCount = 0;
if (axis()->type() == QAbstractAxis::AxisTypeValue) {
QValueAxis *valueAxis = qobject_cast<QValueAxis *>(axis());
- expectedCount = valueAxis->minorTickCount() * (valueAxis->tickCount() - 1);
- expectedCount = qMax(expectedCount, 0);
+ if (valueAxis->tickType() == QValueAxis::TicksFixed) {
+ expectedCount = valueAxis->minorTickCount() * (valueAxis->tickCount() - 1);
+ expectedCount = qMax(expectedCount, 0);
+ } else {
+ const qreal interval = valueAxis->tickInterval();
+ qreal firstMajorTick = valueAxis->tickAnchor();
+ const qreal max = valueAxis->max();
+ const qreal min = valueAxis->min();
+ const int _minorTickCount = valueAxis->minorTickCount();
+
+ if (min < firstMajorTick)
+ firstMajorTick = firstMajorTick - qCeil((firstMajorTick - min) / interval) * interval;
+ else
+ firstMajorTick = firstMajorTick + int((min - firstMajorTick) / interval) * interval;
+
+ const qreal deltaMinor = interval / qreal(_minorTickCount + 1);
+ qreal minorTick = firstMajorTick + deltaMinor;
+ int minorCounter = 0;
+
+ while (minorTick < min) {
+ minorTick += deltaMinor;
+ minorCounter++;
+ }
+
+ QVector<qreal> points;
+
+ // Calculate the points on axis value space. Conversion to graphical points
+ // will be done on axis specific geometry update function
+ while (minorTick <= max || qFuzzyCompare(minorTick, max)) {
+ if (minorCounter < _minorTickCount) {
+ expectedCount++;
+ minorCounter++;
+ points << (minorTick - min);
+ } else {
+ minorCounter = 0;
+ }
+ minorTick += deltaMinor;
+ }
+
+ setDynamicMinorTickLayout(points);
+ }
} else if (axis()->type() == QAbstractAxis::AxisTypeLogValue) {
QLogValueAxis *logValueAxis = qobject_cast<QLogValueAxis *>(axis());
diff --git a/src/charts/axis/chartaxiselement.cpp b/src/charts/axis/chartaxiselement.cpp
index a090582f..4a30d26c 100644
--- a/src/charts/axis/chartaxiselement.cpp
+++ b/src/charts/axis/chartaxiselement.cpp
@@ -298,6 +298,24 @@ qreal ChartAxisElement::max() const
return m_axis->d_ptr->max();
}
+qreal ChartAxisElement::tickInterval() const
+{
+ QValueAxis *valueAxis = qobject_cast<QValueAxis *>(m_axis);
+ if (valueAxis)
+ return valueAxis->tickInterval();
+ else
+ return 0.0;
+}
+
+qreal ChartAxisElement::tickAnchor() const
+{
+ QValueAxis *valueAxis = qobject_cast<QValueAxis *>(m_axis);
+ if (valueAxis)
+ return valueAxis->tickAnchor();
+ else
+ return 0.0;
+}
+
QString ChartAxisElement::formatLabel(const QString &formatSpec, const QByteArray &array,
qreal value, int precision, const QString &preStr,
const QString &postStr) const
@@ -337,6 +355,8 @@ QString ChartAxisElement::formatLabel(const QString &formatSpec, const QByteArra
}
QStringList ChartAxisElement::createValueLabels(qreal min, qreal max, int ticks,
+ qreal tickInterval, qreal tickAnchor,
+ QValueAxis::TickType tickType,
const QString &format) const
{
QStringList labels;
@@ -346,9 +366,22 @@ QStringList ChartAxisElement::createValueLabels(qreal min, qreal max, int ticks,
if (format.isEmpty()) {
int n = qMax(int(-qFloor(std::log10((max - min) / (ticks - 1)))), 0) + 1;
- for (int i = 0; i < ticks; i++) {
- qreal value = min + (i * (max - min) / (ticks - 1));
- labels << presenter()->numberToString(value, 'f', n);
+ if (tickType == QValueAxis::TicksFixed) {
+ for (int i = 0; i < ticks; i++) {
+ qreal value = min + (i * (max - min) / (ticks - 1));
+ labels << presenter()->numberToString(value, 'f', n);
+ }
+ } else {
+ qreal value = tickAnchor;
+ if (value > min)
+ value = value - int((value - min) / tickInterval) * tickInterval;
+ else
+ value = value + qCeil((min - value) / tickInterval) * tickInterval;
+
+ while (value <= max || qFuzzyCompare(value, max)) {
+ labels << presenter()->numberToString(value, 'f', n);
+ value += tickInterval;
+ }
}
} else {
QByteArray array = format.toLatin1();
@@ -375,9 +408,22 @@ QStringList ChartAxisElement::createValueLabels(qreal min, qreal max, int ticks,
if (format.indexOf(*labelFormatMatcher, 0, &rmatch) != -1)
formatSpec = rmatch.captured(1);
}
- for (int i = 0; i < ticks; i++) {
- qreal value = min + (i * (max - min) / (ticks - 1));
- labels << formatLabel(formatSpec, array, value, precision, preStr, postStr);
+ if (tickType == QValueAxis::TicksFixed) {
+ for (int i = 0; i < ticks; i++) {
+ qreal value = min + (i * (max - min) / (ticks - 1));
+ labels << formatLabel(formatSpec, array, value, precision, preStr, postStr);
+ }
+ } else {
+ qreal value = tickAnchor;
+ if (value > min)
+ value = value - int((value - min) / tickInterval) * tickInterval;
+ else
+ value = value + qCeil((min - value) / tickInterval) * tickInterval;
+
+ while (value <= max || qFuzzyCompare(value, max)) {
+ labels << formatLabel(formatSpec, array, value, precision, preStr, postStr);
+ value += tickInterval;
+ }
}
}
@@ -449,8 +495,6 @@ QStringList ChartAxisElement::createDateTimeLabels(qreal min, qreal max,int tick
if (max <= min || ticks < 1)
return labels;
- int n = qMax(int(-qFloor(std::log10((max - min) / (ticks - 1)))), 0);
- n++;
for (int i = 0; i < ticks; i++) {
qreal value = min + (i * (max - min) / (ticks - 1));
labels << presenter()->locale().toString(QDateTime::fromMSecsSinceEpoch(value), format);
diff --git a/src/charts/axis/chartaxiselement_p.h b/src/charts/axis/chartaxiselement_p.h
index 085a75db..7aced068 100644
--- a/src/charts/axis/chartaxiselement_p.h
+++ b/src/charts/axis/chartaxiselement_p.h
@@ -45,6 +45,7 @@
#include <private/axisanimation_p.h>
#include <QtWidgets/QGraphicsItem>
#include <QtWidgets/QGraphicsLayoutItem>
+#include <QtCharts/QValueAxis>
#include <QtGui/QFont>
QT_CHARTS_BEGIN_NAMESPACE
@@ -71,6 +72,8 @@ public:
QAbstractAxis *axis() const { return m_axis; }
void setLayout(QVector<qreal> &layout) { m_layout = layout; }
QVector<qreal> &layout() { return m_layout; } // Modifiable reference
+ void setDynamicMinorTickLayout(const QVector<qreal> &layout) { m_dynamicMinorTickLayout = layout; }
+ QVector<qreal> &dynamicMinorTicklayout() { return m_dynamicMinorTickLayout; } // Modifiable reference
inline qreal labelPadding() const { return qreal(4.0); }
inline qreal titlePadding() const { return qreal(2.0); }
void setLabels(const QStringList &labels) { m_labelsList = labels; }
@@ -79,6 +82,9 @@ public:
qreal min() const;
qreal max() const;
+ qreal tickInterval() const;
+ qreal tickAnchor() const;
+
QRectF axisGeometry() const { return m_axisRect; }
void setAxisGeometry(const QRectF &axisGeometry) { m_axisRect = axisGeometry; }
@@ -87,7 +93,9 @@ public:
//this flag indicates that axis is used to show intervals it means labels are in between ticks
bool intervalAxis() const { return m_intervalAxis; }
- QStringList createValueLabels(qreal max, qreal min, int ticks, const QString &format) const;
+ QStringList createValueLabels(qreal max, qreal min, int ticks,
+ qreal tickInterval, qreal tickAnchor,
+ QValueAxis::TickType tickType, const QString &format) const;
QStringList createLogValueLabels(qreal min, qreal max, qreal base, int ticks,
const QString &format) const;
QStringList createDateTimeLabels(qreal max, qreal min, int ticks, const QString &format) const;
@@ -160,6 +168,7 @@ private:
QAbstractAxis *m_axis;
AxisAnimation *m_animation;
QVector<qreal> m_layout;
+ QVector<qreal> m_dynamicMinorTickLayout;
QStringList m_labelsList;
QRectF m_axisRect;
QScopedPointer<QGraphicsItemGroup> m_grid;
diff --git a/src/charts/axis/horizontalaxis.cpp b/src/charts/axis/horizontalaxis.cpp
index e8455703..821961c7 100644
--- a/src/charts/axis/horizontalaxis.cpp
+++ b/src/charts/axis/horizontalaxis.cpp
@@ -75,9 +75,12 @@ QSizeF HorizontalAxis::sizeHint(Qt::SizeHint which, const QSizeF &constraint) co
void HorizontalAxis::updateGeometry()
{
const QVector<qreal> &layout = ChartAxisElement::layout();
+ const QVector<qreal> &dynamicMinorTicklayout = ChartAxisElement::dynamicMinorTicklayout();
- if (layout.isEmpty() && axis()->type() != QAbstractAxis::AxisTypeLogValue)
+ if (layout.isEmpty() && dynamicMinorTicklayout.isEmpty()
+ && axis()->type() != QAbstractAxis::AxisTypeLogValue) {
return;
+ }
QStringList labelList = labels();
@@ -343,12 +346,14 @@ void HorizontalAxis::updateMinorTickGeometry()
minorTickCount = valueAxis->minorTickCount();
- if (valueAxis->tickCount() >= 2)
- tickSpacing = layout.at(0) - layout.at(1);
+ if (valueAxis->tickType() == QValueAxis::TicksFixed) {
+ if (valueAxis->tickCount() >= 2)
+ tickSpacing = layout.at(0) - layout.at(1);
- for (int i = 0; i < minorTickCount; ++i) {
- const qreal ratio = (1.0 / qreal(minorTickCount + 1)) * qreal(i + 1);
- minorTickSpacings.append(tickSpacing * ratio);
+ for (int i = 0; i < minorTickCount; ++i) {
+ const qreal ratio = (1.0 / qreal(minorTickCount + 1)) * qreal(i + 1);
+ minorTickSpacings.append(tickSpacing * ratio);
+ }
}
break;
}
@@ -402,28 +407,27 @@ void HorizontalAxis::updateMinorTickGeometry()
break;
}
- if (minorTickCount < 1 || tickSpacing == 0.0 || minorTickSpacings.count() != minorTickCount)
- return;
+ const QValueAxis *valueAxis = qobject_cast<QValueAxis *>(axis());
+ if (valueAxis && valueAxis->tickType() == QValueAxis::TicksDynamic) {
+ const QVector<qreal> dynamicMinorTicklayout = ChartAxisElement::dynamicMinorTicklayout();
+ const QRectF &gridRect = gridGeometry();
+ const qreal deltaX = gridRect.width() / (valueAxis->max() - valueAxis->min());
+ const qreal leftPos = gridRect.left();
+ const qreal rightPos = gridRect.right();
- for (int i = 0; i < layout.size() - 1; ++i) {
- for (int j = 0; j < minorTickCount; ++j) {
- const int minorItemIndex = i * minorTickCount + j;
+ for (int i = 0; i < dynamicMinorTicklayout.size(); i++) {
QGraphicsLineItem *minorGridLineItem =
- static_cast<QGraphicsLineItem *>(minorGridItems().value(minorItemIndex));
+ static_cast<QGraphicsLineItem *>(minorGridItems().value(i));
QGraphicsLineItem *minorArrowLineItem =
- static_cast<QGraphicsLineItem *>(minorArrowItems().value(minorItemIndex));
+ static_cast<QGraphicsLineItem *>(minorArrowItems().value(i));
if (!minorGridLineItem || !minorArrowLineItem)
continue;
- const qreal minorTickSpacing = minorTickSpacings.value(j, 0.0);
-
qreal minorGridLineItemX = 0.0;
- if (axis()->isReverse()) {
- minorGridLineItemX = qFloor(gridGeometry().left() + gridGeometry().right()
- - layout.at(i) + minorTickSpacing);
- } else {
- minorGridLineItemX = qCeil(layout.at(i) - minorTickSpacing);
- }
+ if (axis()->isReverse())
+ minorGridLineItemX = rightPos - dynamicMinorTicklayout.at(i) * deltaX;
+ else
+ minorGridLineItemX = dynamicMinorTicklayout.at(i) * deltaX + leftPos;
qreal minorArrowLineItemY1;
qreal minorArrowLineItemY2;
@@ -453,6 +457,59 @@ void HorizontalAxis::updateMinorTickGeometry()
minorGridLineItem->setVisible(minorGridLineVisible);
minorArrowLineItem->setVisible(minorGridLineVisible);
}
+ } else {
+ if (minorTickCount < 1 || tickSpacing == 0.0 || minorTickSpacings.count() != minorTickCount)
+ return;
+
+ for (int i = 0; i < layout.size() - 1; ++i) {
+ for (int j = 0; j < minorTickCount; ++j) {
+ const int minorItemIndex = i * minorTickCount + j;
+ QGraphicsLineItem *minorGridLineItem =
+ static_cast<QGraphicsLineItem *>(minorGridItems().value(minorItemIndex));
+ QGraphicsLineItem *minorArrowLineItem =
+ static_cast<QGraphicsLineItem *>(minorArrowItems().value(minorItemIndex));
+ if (!minorGridLineItem || !minorArrowLineItem)
+ continue;
+
+ const qreal minorTickSpacing = minorTickSpacings.value(j, 0.0);
+
+ qreal minorGridLineItemX = 0.0;
+ if (axis()->isReverse()) {
+ minorGridLineItemX = qFloor(gridGeometry().left() + gridGeometry().right()
+ - layout.at(i) + minorTickSpacing);
+ } else {
+ minorGridLineItemX = qCeil(layout.at(i) - minorTickSpacing);
+ }
+
+ qreal minorArrowLineItemY1;
+ qreal minorArrowLineItemY2;
+ switch (axis()->alignment()) {
+ case Qt::AlignTop:
+ minorArrowLineItemY1 = gridGeometry().bottom();
+ minorArrowLineItemY2 = gridGeometry().bottom() - labelPadding() / 2.0;
+ break;
+ case Qt::AlignBottom:
+ minorArrowLineItemY1 = gridGeometry().top();
+ minorArrowLineItemY2 = gridGeometry().top() + labelPadding() / 2.0;
+ break;
+ default:
+ minorArrowLineItemY1 = 0.0;
+ minorArrowLineItemY2 = 0.0;
+ break;
+ }
+
+ minorGridLineItem->setLine(minorGridLineItemX, gridGeometry().top(),
+ minorGridLineItemX, gridGeometry().bottom());
+ minorArrowLineItem->setLine(minorGridLineItemX, minorArrowLineItemY1,
+ minorGridLineItemX, minorArrowLineItemY2);
+
+ // check if the minor grid line and the minor axis arrow should be shown
+ bool minorGridLineVisible = (minorGridLineItemX >= gridGeometry().left()
+ && minorGridLineItemX <= gridGeometry().right());
+ minorGridLineItem->setVisible(minorGridLineVisible);
+ minorArrowLineItem->setVisible(minorGridLineVisible);
+ }
+ }
}
}
diff --git a/src/charts/axis/valueaxis/chartvalueaxisx.cpp b/src/charts/axis/valueaxis/chartvalueaxisx.cpp
index 0df4095b..c7e6e236 100644
--- a/src/charts/axis/valueaxis/chartvalueaxisx.cpp
+++ b/src/charts/axis/valueaxis/chartvalueaxisx.cpp
@@ -47,6 +47,10 @@ ChartValueAxisX::ChartValueAxisX(QValueAxis *axis, QGraphicsItem *item )
QObject::connect(m_axis, SIGNAL(minorTickCountChanged(int)),
this, SLOT(handleMinorTickCountChanged(int)));
QObject::connect(m_axis, SIGNAL(labelFormatChanged(QString)), this, SLOT(handleLabelFormatChanged(QString)));
+ QObject::connect(m_axis, SIGNAL(tickIntervalChanged(qreal)), this, SLOT(handleTickIntervalChanged(qreal)));
+ QObject::connect(m_axis, SIGNAL(tickAnchorChanged(qreal)), this, SLOT(handleTickAnchorChanged(qreal)));
+ QObject::connect(m_axis, SIGNAL(tickTypeChanged(QValueAxis::TickType)), this,
+ SLOT(handleTickTypeChanged(QValueAxis::TickType)));
}
ChartValueAxisX::~ChartValueAxisX()
@@ -55,26 +59,53 @@ ChartValueAxisX::~ChartValueAxisX()
QVector<qreal> ChartValueAxisX::calculateLayout() const
{
- int tickCount = m_axis->tickCount();
-
- Q_ASSERT(tickCount >= 2);
-
- QVector<qreal> points;
- points.resize(tickCount);
+ if (m_axis->tickType() == QValueAxis::TicksFixed) {
+ int tickCount = m_axis->tickCount();
+
+ Q_ASSERT(tickCount >= 2);
+
+ QVector<qreal> points;
+ points.resize(tickCount);
+
+ const QRectF &gridRect = gridGeometry();
+ const qreal deltaX = gridRect.width() / (qreal(tickCount) - 1.0);
+ for (int i = 0; i < tickCount; ++i)
+ points[i] = qreal(i) * deltaX + gridRect.left();
+ return points;
+ } else { // QValueAxis::TicksDynamic
+ const qreal interval = m_axis->tickInterval();
+ qreal value = m_axis->tickAnchor();
+ const qreal maxValue = max();
+ const qreal minValue = min();
+
+ // Find the first major tick right after the min of range
+ if (value > minValue)
+ value = value - int((value - minValue) / interval) * interval;
+ else
+ value = value + qCeil((minValue - value) / interval) * interval;
+
+ const QRectF &gridRect = gridGeometry();
+ const qreal deltaX = gridRect.width() / (maxValue - minValue);
+
+ QVector<qreal> points;
+ const qreal leftPos = gridRect.left();
+ while (value <= maxValue || qFuzzyCompare(value, maxValue)) {
+ points << (value - minValue) * deltaX + leftPos;
+ value += interval;
+ }
- const QRectF &gridRect = gridGeometry();
- const qreal deltaX = gridRect.width() / (qreal(tickCount) - 1.0);
- for (int i = 0; i < tickCount; ++i)
- points[i] = qreal(i) * deltaX + gridRect.left();
- return points;
+ return points;
+ }
}
void ChartValueAxisX::updateGeometry()
{
const QVector<qreal>& layout = ChartAxisElement::layout();
- if (layout.isEmpty())
+ const QVector<qreal>& dynamicMinorTicklayout = ChartAxisElement::dynamicMinorTicklayout();
+ if (layout.isEmpty() && dynamicMinorTicklayout.isEmpty())
return;
- setLabels(createValueLabels(min(), max(), layout.size(), m_axis->labelFormat()));
+ setLabels(createValueLabels(min(), max(), layout.size(), m_axis->tickInterval(),
+ m_axis->tickAnchor(), m_axis->tickType(), m_axis->labelFormat()));
HorizontalAxis::updateGeometry();
}
@@ -82,7 +113,7 @@ void ChartValueAxisX::handleTickCountChanged(int tick)
{
Q_UNUSED(tick);
QGraphicsLayoutItem::updateGeometry();
- if(presenter()) presenter()->layout()->invalidate();
+ if (presenter()) presenter()->layout()->invalidate();
}
void ChartValueAxisX::handleMinorTickCountChanged(int tick)
@@ -97,7 +128,28 @@ void ChartValueAxisX::handleLabelFormatChanged(const QString &format)
{
Q_UNUSED(format);
QGraphicsLayoutItem::updateGeometry();
- if(presenter()) presenter()->layout()->invalidate();
+ if (presenter()) presenter()->layout()->invalidate();
+}
+
+void ChartValueAxisX::handleTickIntervalChanged(qreal interval)
+{
+ Q_UNUSED(interval)
+ QGraphicsLayoutItem::updateGeometry();
+ if (presenter()) presenter()->layout()->invalidate();
+}
+
+void ChartValueAxisX::handleTickAnchorChanged(qreal anchor)
+{
+ Q_UNUSED(anchor)
+ QGraphicsLayoutItem::updateGeometry();
+ if (presenter()) presenter()->layout()->invalidate();
+}
+
+void ChartValueAxisX::handleTickTypeChanged(QValueAxis::TickType type)
+{
+ Q_UNUSED(type)
+ QGraphicsLayoutItem::updateGeometry();
+ if (presenter()) presenter()->layout()->invalidate();
}
QSizeF ChartValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
@@ -107,7 +159,9 @@ QSizeF ChartValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c
QSizeF sh;
QSizeF base = HorizontalAxis::sizeHint(which, constraint);
- QStringList ticksList = createValueLabels(min(),max(),m_axis->tickCount(),m_axis->labelFormat());
+ QStringList ticksList = createValueLabels(min(), max(), m_axis->tickCount(),
+ m_axis->tickInterval(), m_axis->tickAnchor(),
+ m_axis->tickType(), m_axis->labelFormat());
// Width of horizontal axis sizeHint indicates the maximum distance labels can extend past
// first and last ticks. Base width is irrelevant.
qreal width = 0;
diff --git a/src/charts/axis/valueaxis/chartvalueaxisx_p.h b/src/charts/axis/valueaxis/chartvalueaxisx_p.h
index bceb7412..5e8b0957 100644
--- a/src/charts/axis/valueaxis/chartvalueaxisx_p.h
+++ b/src/charts/axis/valueaxis/chartvalueaxisx_p.h
@@ -61,6 +61,9 @@ private Q_SLOTS:
void handleTickCountChanged(int tick);
void handleMinorTickCountChanged(int tick);
void handleLabelFormatChanged(const QString &format);
+ void handleTickIntervalChanged(qreal interval);
+ void handleTickAnchorChanged(qreal anchor);
+ void handleTickTypeChanged(QValueAxis::TickType type);
private:
QValueAxis *m_axis;
diff --git a/src/charts/axis/valueaxis/chartvalueaxisy.cpp b/src/charts/axis/valueaxis/chartvalueaxisy.cpp
index 1a9faac1..2f0212a0 100644
--- a/src/charts/axis/valueaxis/chartvalueaxisy.cpp
+++ b/src/charts/axis/valueaxis/chartvalueaxisy.cpp
@@ -46,6 +46,10 @@ ChartValueAxisY::ChartValueAxisY(QValueAxis *axis, QGraphicsItem *item)
QObject::connect(m_axis, SIGNAL(minorTickCountChanged(int)),
this, SLOT(handleMinorTickCountChanged(int)));
QObject::connect(m_axis, SIGNAL(labelFormatChanged(QString)), this, SLOT(handleLabelFormatChanged(QString)));
+ QObject::connect(m_axis, SIGNAL(tickIntervalChanged(qreal)), this, SLOT(handleTickIntervalChanged(qreal)));
+ QObject::connect(m_axis, SIGNAL(tickAnchorChanged(qreal)), this, SLOT(handleTickAnchorChanged(qreal)));
+ QObject::connect(m_axis, SIGNAL(tickTypeChanged(QValueAxis::TickType)), this,
+ SLOT(handleTickTypeChanged(QValueAxis::TickType)));
}
ChartValueAxisY::~ChartValueAxisY()
@@ -54,28 +58,55 @@ ChartValueAxisY::~ChartValueAxisY()
QVector<qreal> ChartValueAxisY::calculateLayout() const
{
- int tickCount = m_axis->tickCount();
+ if (m_axis->tickType() == QValueAxis::TicksFixed) {
+ int tickCount = m_axis->tickCount();
- Q_ASSERT(tickCount >= 2);
+ Q_ASSERT(tickCount >= 2);
- QVector<qreal> points;
- points.resize(tickCount);
+ QVector<qreal> points;
+ points.resize(tickCount);
- const QRectF &gridRect = gridGeometry();
+ const QRectF &gridRect = gridGeometry();
- const qreal deltaY = gridRect.height() / (qreal(tickCount) - 1.0);
- for (int i = 0; i < tickCount; ++i)
- points[i] = qreal(i) * -deltaY + gridRect.bottom();
+ const qreal deltaY = gridRect.height() / (qreal(tickCount) - 1.0);
+ for (int i = 0; i < tickCount; ++i)
+ points[i] = qreal(i) * -deltaY + gridRect.bottom();
- return points;
+ return points;
+ } else {
+ const qreal interval = m_axis->tickInterval();
+ qreal value = m_axis->tickAnchor();
+ const qreal maxValue = max();
+ const qreal minValue = min();
+
+ // Find the first major tick right after the min of range
+ if (value > minValue)
+ value = value - int((value - minValue) / interval) * interval;
+ else
+ value = value + qCeil((minValue - value) / interval) * interval;
+
+ const QRectF &gridRect = gridGeometry();
+ const qreal deltaY = gridRect.height() / (maxValue - minValue);
+
+ QVector<qreal> points;
+ const qreal bottomPos = gridRect.bottom();
+ while (value <= maxValue || qFuzzyCompare(value, maxValue)) {
+ points << (value - minValue) * -deltaY + bottomPos;
+ value += interval;
+ }
+
+ return points;
+ }
}
void ChartValueAxisY::updateGeometry()
{
const QVector<qreal> &layout = ChartAxisElement::layout();
- if (layout.isEmpty())
+ const QVector<qreal>& dynamicMinorTicklayout = ChartAxisElement::dynamicMinorTicklayout();
+ if (layout.isEmpty() && dynamicMinorTicklayout.isEmpty())
return;
- setLabels(createValueLabels(min(),max(),layout.size(),m_axis->labelFormat()));
+ setLabels(createValueLabels(min(), max(), layout.size(), m_axis->tickInterval(),
+ m_axis->tickAnchor(), m_axis->tickType(), m_axis->labelFormat()));
VerticalAxis::updateGeometry();
}
@@ -98,7 +129,28 @@ void ChartValueAxisY::handleLabelFormatChanged(const QString &format)
{
Q_UNUSED(format);
QGraphicsLayoutItem::updateGeometry();
- if(presenter()) presenter()->layout()->invalidate();
+ if (presenter()) presenter()->layout()->invalidate();
+}
+
+void ChartValueAxisY::handleTickIntervalChanged(qreal interval)
+{
+ Q_UNUSED(interval)
+ QGraphicsLayoutItem::updateGeometry();
+ if (presenter()) presenter()->layout()->invalidate();
+}
+
+void ChartValueAxisY::handleTickAnchorChanged(qreal anchor)
+{
+ Q_UNUSED(anchor)
+ QGraphicsLayoutItem::updateGeometry();
+ if (presenter()) presenter()->layout()->invalidate();
+}
+
+void ChartValueAxisY::handleTickTypeChanged(QValueAxis::TickType type)
+{
+ Q_UNUSED(type)
+ QGraphicsLayoutItem::updateGeometry();
+ if (presenter()) presenter()->layout()->invalidate();
}
QSizeF ChartValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
@@ -107,7 +159,9 @@ QSizeF ChartValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c
QSizeF sh;
QSizeF base = VerticalAxis::sizeHint(which, constraint);
- QStringList ticksList = createValueLabels(min(),max(),m_axis->tickCount(),m_axis->labelFormat());
+ QStringList ticksList = createValueLabels(min(), max(), m_axis->tickCount(),
+ m_axis->tickInterval(), m_axis->tickAnchor(),
+ m_axis->tickType(), m_axis->labelFormat());
qreal width = 0;
// Height of vertical axis sizeHint indicates the maximum distance labels can extend past
// first and last ticks. Base height is irrelevant.
diff --git a/src/charts/axis/valueaxis/chartvalueaxisy_p.h b/src/charts/axis/valueaxis/chartvalueaxisy_p.h
index 2d0030d7..72c148ac 100644
--- a/src/charts/axis/valueaxis/chartvalueaxisy_p.h
+++ b/src/charts/axis/valueaxis/chartvalueaxisy_p.h
@@ -61,6 +61,9 @@ private Q_SLOTS:
void handleTickCountChanged(int tick);
void handleMinorTickCountChanged(int tick);
void handleLabelFormatChanged(const QString &format);
+ void handleTickIntervalChanged(qreal interval);
+ void handleTickAnchorChanged(qreal anchor);
+ void handleTickTypeChanged(QValueAxis::TickType type);
private:
QValueAxis *m_axis;
diff --git a/src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp b/src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp
index 56964ed5..f4eb98d8 100644
--- a/src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp
+++ b/src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp
@@ -66,7 +66,9 @@ QVector<qreal> PolarChartValueAxisAngular::calculateLayout() const
void PolarChartValueAxisAngular::createAxisLabels(const QVector<qreal> &layout)
{
- QStringList labelList = createValueLabels(min(), max(), layout.size(), static_cast<QValueAxis *>(axis())->labelFormat());
+ QStringList labelList = createValueLabels(min(), max(), layout.size(), 0.0, 0.0,
+ QValueAxis::TicksFixed,
+ static_cast<QValueAxis *>(axis())->labelFormat());
setLabels(labelList);
}
diff --git a/src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp b/src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp
index d3512b91..b6842185 100644
--- a/src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp
+++ b/src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp
@@ -66,7 +66,9 @@ QVector<qreal> PolarChartValueAxisRadial::calculateLayout() const
void PolarChartValueAxisRadial::createAxisLabels(const QVector<qreal> &layout)
{
- setLabels(createValueLabels(min(), max(), layout.size(), static_cast<QValueAxis *>(axis())->labelFormat()));
+ setLabels(createValueLabels(min(), max(), layout.size(), 0.0, 0.0,
+ QValueAxis::TicksFixed,
+ static_cast<QValueAxis *>(axis())->labelFormat()));
}
void PolarChartValueAxisRadial::handleTickCountChanged(int tick)
diff --git a/src/charts/axis/valueaxis/qvalueaxis.cpp b/src/charts/axis/valueaxis/qvalueaxis.cpp
index 65dd0dd2..d874e2dd 100644
--- a/src/charts/axis/valueaxis/qvalueaxis.cpp
+++ b/src/charts/axis/valueaxis/qvalueaxis.cpp
@@ -139,6 +139,54 @@ QT_CHARTS_BEGIN_NAMESPACE
*/
/*!
+ \property QValueAxis::tickAnchor
+ \since 5.12
+ \brief The base value where the dynamically placed tick marks and labels are started from.
+*/
+/*!
+ \qmlproperty real ValueAxis::tickAnchor
+ \since QtCharts 2.3
+ The base value where the dynamically placed tick marks and labels are started from.
+*/
+
+/*!
+ \property QValueAxis::tickInterval
+ \since 5.12
+ \brief The interval between dynamically placed tick marks and labels.
+*/
+/*!
+ \qmlproperty real ValueAxis::tickInterval
+ \since QtCharts 2.3
+ The interval between dynamically placed tick marks and labels.
+*/
+
+/*!
+ \enum QValueAxis::TickType
+
+ This enum describes how the ticks and labels are positioned on the axis.
+
+ \value TicksDynamic Ticks are placed according to tickAnchor and tickInterval values.
+ \value TicksFixed Ticks are placed evenly across the axis range. The tickCount value
+ specifies the number of ticks.
+ */
+/*!
+ \property QValueAxis::tickType
+ \since 5.12
+ \brief The positioning method of tick and labels.
+*/
+/*!
+ \qmlproperty enumeration ValueAxis::tickType
+ \since QtCharts 2.3
+
+ The positioning method of tick and labels.
+
+ \value ValueAxis.TicksDynamic
+ Ticks are placed according to tickAnchor and tickInterval values.
+ \value ValueAxis.TicksFixed
+ Ticks are placed evenly across the axis range. The tickCount value specifies the number of ticks.
+*/
+
+/*!
\property QValueAxis::labelFormat
\brief The label format of the axis.
@@ -296,6 +344,52 @@ int QValueAxis::minorTickCount() const
return d->m_minorTickCount;
}
+
+void QValueAxis::setTickInterval(qreal interval)
+{
+ Q_D(QValueAxis);
+ if (d->m_tickInterval != interval) {
+ d->m_tickInterval = interval;
+ emit tickIntervalChanged(interval);
+ }
+}
+
+qreal QValueAxis::tickInterval() const
+{
+ Q_D(const QValueAxis);
+ return d->m_tickInterval;
+}
+
+void QValueAxis::setTickAnchor(qreal anchor)
+{
+ Q_D(QValueAxis);
+ if (d->m_tickAnchor != anchor) {
+ d->m_tickAnchor = anchor;
+ emit tickAnchorChanged(anchor);
+ }
+}
+
+qreal QValueAxis::tickAnchor() const
+{
+ Q_D(const QValueAxis);
+ return d->m_tickAnchor;
+}
+
+void QValueAxis::setTickType(QValueAxis::TickType type)
+{
+ Q_D(QValueAxis);
+ if (d->m_tickType != type) {
+ d->m_tickType = type;
+ emit tickTypeChanged(type);
+ }
+}
+
+QValueAxis::TickType QValueAxis::tickType() const
+{
+ Q_D(const QValueAxis);
+ return d->m_tickType;
+}
+
void QValueAxis::setLabelFormat(const QString &format)
{
Q_D(QValueAxis);
@@ -355,7 +449,10 @@ QValueAxisPrivate::QValueAxisPrivate(QValueAxis *q)
m_tickCount(5),
m_minorTickCount(0),
m_format(),
- m_applying(false)
+ m_applying(false),
+ m_tickInterval(0.0),
+ m_tickAnchor(0.0),
+ m_tickType(QValueAxis::TicksFixed)
{
}
diff --git a/src/charts/axis/valueaxis/qvalueaxis.h b/src/charts/axis/valueaxis/qvalueaxis.h
index 45f54be9..e7bb19f4 100644
--- a/src/charts/axis/valueaxis/qvalueaxis.h
+++ b/src/charts/axis/valueaxis/qvalueaxis.h
@@ -44,6 +44,16 @@ class QT_CHARTS_EXPORT QValueAxis : public QAbstractAxis
Q_PROPERTY(qreal max READ max WRITE setMax NOTIFY maxChanged)
Q_PROPERTY(QString labelFormat READ labelFormat WRITE setLabelFormat NOTIFY labelFormatChanged)
Q_PROPERTY(int minorTickCount READ minorTickCount WRITE setMinorTickCount NOTIFY minorTickCountChanged)
+ Q_PROPERTY(qreal tickAnchor READ tickAnchor WRITE setTickAnchor NOTIFY tickAnchorChanged REVISION 1)
+ Q_PROPERTY(qreal tickInterval READ tickInterval WRITE setTickInterval NOTIFY tickIntervalChanged REVISION 1)
+ Q_PROPERTY(TickType tickType READ tickType WRITE setTickType NOTIFY tickTypeChanged REVISION 1)
+ Q_ENUMS(TickType)
+
+public:
+ enum TickType {
+ TicksDynamic = 0,
+ TicksFixed
+ };
public:
explicit QValueAxis(QObject *parent = nullptr);
@@ -67,6 +77,12 @@ public:
int tickCount() const;
void setMinorTickCount(int count);
int minorTickCount() const;
+ void setTickAnchor(qreal anchor);
+ qreal tickAnchor() const;
+ void setTickInterval(qreal insterval);
+ qreal tickInterval() const;
+ void setTickType(QValueAxis::TickType type);
+ QValueAxis::TickType tickType() const;
void setLabelFormat(const QString &format);
QString labelFormat() const;
@@ -81,6 +97,9 @@ Q_SIGNALS:
void tickCountChanged(int tickCount);
void minorTickCountChanged(int tickCount);
void labelFormatChanged(const QString &format);
+ Q_REVISION(1) void tickIntervalChanged(qreal interval);
+ Q_REVISION(1) void tickAnchorChanged(qreal anchor);
+ Q_REVISION(1) void tickTypeChanged(QValueAxis::TickType type);
private:
Q_DECLARE_PRIVATE(QValueAxis)
diff --git a/src/charts/axis/valueaxis/qvalueaxis_p.h b/src/charts/axis/valueaxis/qvalueaxis_p.h
index b020b0f7..ad5df817 100644
--- a/src/charts/axis/valueaxis/qvalueaxis_p.h
+++ b/src/charts/axis/valueaxis/qvalueaxis_p.h
@@ -60,6 +60,9 @@ public:
qreal max() { return m_max; }
void setRange(qreal min,qreal max);
+ qreal tickInterval() { return m_tickInterval; }
+ qreal tickAnchor() { return m_tickAnchor; }
+
protected:
void setMin(const QVariant &min);
void setMax(const QVariant &max);
@@ -72,6 +75,9 @@ private:
int m_minorTickCount;
QString m_format;
bool m_applying;
+ qreal m_tickInterval;
+ qreal m_tickAnchor;
+ QValueAxis::TickType m_tickType;
Q_DECLARE_PUBLIC(QValueAxis)
};
diff --git a/src/charts/axis/verticalaxis.cpp b/src/charts/axis/verticalaxis.cpp
index de33a388..fc0f093b 100644
--- a/src/charts/axis/verticalaxis.cpp
+++ b/src/charts/axis/verticalaxis.cpp
@@ -75,9 +75,12 @@ QSizeF VerticalAxis::sizeHint(Qt::SizeHint which, const QSizeF &constraint) cons
void VerticalAxis::updateGeometry()
{
const QVector<qreal> &layout = ChartAxisElement::layout();
+ const QVector<qreal> &dynamicMinorTicklayout = ChartAxisElement::dynamicMinorTicklayout();
- if (layout.isEmpty() && axis()->type() != QAbstractAxis::AxisTypeLogValue)
+ if (layout.isEmpty() && dynamicMinorTicklayout.isEmpty()
+ && axis()->type() != QAbstractAxis::AxisTypeLogValue) {
return;
+ }
QStringList labelList = labels();
@@ -362,12 +365,14 @@ void VerticalAxis::updateMinorTickGeometry()
minorTickCount = valueAxis->minorTickCount();
- if (valueAxis->tickCount() >= 2)
- tickSpacing = layout.at(0) - layout.at(1);
+ if (valueAxis->tickType() == QValueAxis::TicksFixed) {
+ if (valueAxis->tickCount() >= 2)
+ tickSpacing = layout.at(0) - layout.at(1);
- for (int i = 0; i < minorTickCount; ++i) {
- const qreal ratio = (1.0 / qreal(minorTickCount + 1)) * qreal(i + 1);
- minorTickSpacings.append(tickSpacing * ratio);
+ for (int i = 0; i < minorTickCount; ++i) {
+ const qreal ratio = (1.0 / qreal(minorTickCount + 1)) * qreal(i + 1);
+ minorTickSpacings.append(tickSpacing * ratio);
+ }
}
break;
}
@@ -421,28 +426,27 @@ void VerticalAxis::updateMinorTickGeometry()
break;
}
- if (minorTickCount < 1 || tickSpacing == 0.0 || minorTickSpacings.count() != minorTickCount)
- return;
+ const QValueAxis *valueAxis = qobject_cast<QValueAxis *>(axis());
+ if (valueAxis && valueAxis->tickType() == QValueAxis::TicksDynamic) {
+ const QVector<qreal> dynamicMinorTicklayout = ChartAxisElement::dynamicMinorTicklayout();
+ const QRectF &gridRect = gridGeometry();
+ const qreal deltaY = gridRect.height() / (valueAxis->max() - valueAxis->min());
+ const qreal bottomPos = gridRect.bottom();
+ const qreal topPos = gridRect.top();
- for (int i = 0; i < layout.size() - 1; ++i) {
- for (int j = 0; j < minorTickCount; ++j) {
- const int minorItemIndex = i * minorTickCount + j;
+ for (int i = 0; i < dynamicMinorTicklayout.size(); i++) {
QGraphicsLineItem *minorGridLineItem =
- static_cast<QGraphicsLineItem *>(minorGridItems().value(minorItemIndex));
+ static_cast<QGraphicsLineItem *>(minorGridItems().value(i));
QGraphicsLineItem *minorArrowLineItem =
- static_cast<QGraphicsLineItem *>(minorArrowItems().value(minorItemIndex));
+ static_cast<QGraphicsLineItem *>(minorArrowItems().value(i));
if (!minorGridLineItem || !minorArrowLineItem)
continue;
- const qreal minorTickSpacing = minorTickSpacings.value(j, 0.0);
-
qreal minorGridLineItemY = 0.0;
- if (axis()->isReverse()) {
- minorGridLineItemY = qFloor(gridGeometry().top() + gridGeometry().bottom()
- - layout.at(i) + minorTickSpacing);
- } else {
- minorGridLineItemY = qCeil(layout.at(i) - minorTickSpacing);
- }
+ if (axis()->isReverse())
+ minorGridLineItemY = topPos + dynamicMinorTicklayout.at(i) * deltaY;
+ else
+ minorGridLineItemY = bottomPos - dynamicMinorTicklayout.at(i) * deltaY;
qreal minorArrowLineItemX1;
qreal minorArrowLineItemX2;
@@ -472,6 +476,59 @@ void VerticalAxis::updateMinorTickGeometry()
minorGridLineItem->setVisible(minorGridLineVisible);
minorArrowLineItem->setVisible(minorGridLineVisible);
}
+ } else {
+ if (minorTickCount < 1 || tickSpacing == 0.0 || minorTickSpacings.count() != minorTickCount)
+ return;
+
+ for (int i = 0; i < layout.size() - 1; ++i) {
+ for (int j = 0; j < minorTickCount; ++j) {
+ const int minorItemIndex = i * minorTickCount + j;
+ QGraphicsLineItem *minorGridLineItem =
+ static_cast<QGraphicsLineItem *>(minorGridItems().value(minorItemIndex));
+ QGraphicsLineItem *minorArrowLineItem =
+ static_cast<QGraphicsLineItem *>(minorArrowItems().value(minorItemIndex));
+ if (!minorGridLineItem || !minorArrowLineItem)
+ continue;
+
+ const qreal minorTickSpacing = minorTickSpacings.value(j, 0.0);
+
+ qreal minorGridLineItemY = 0.0;
+ if (axis()->isReverse()) {
+ minorGridLineItemY = qFloor(gridGeometry().top() + gridGeometry().bottom()
+ - layout.at(i) + minorTickSpacing);
+ } else {
+ minorGridLineItemY = qCeil(layout.at(i) - minorTickSpacing);
+ }
+
+ qreal minorArrowLineItemX1;
+ qreal minorArrowLineItemX2;
+ switch (axis()->alignment()) {
+ case Qt::AlignLeft:
+ minorArrowLineItemX1 = gridGeometry().left() - labelPadding() / 2.0;
+ minorArrowLineItemX2 = gridGeometry().left();
+ break;
+ case Qt::AlignRight:
+ minorArrowLineItemX1 = gridGeometry().right();
+ minorArrowLineItemX2 = gridGeometry().right() + labelPadding() / 2.0;
+ break;
+ default:
+ minorArrowLineItemX1 = 0.0;
+ minorArrowLineItemX2 = 0.0;
+ break;
+ }
+
+ minorGridLineItem->setLine(gridGeometry().left(), minorGridLineItemY,
+ gridGeometry().right(), minorGridLineItemY);
+ minorArrowLineItem->setLine(minorArrowLineItemX1, minorGridLineItemY,
+ minorArrowLineItemX2, minorGridLineItemY);
+
+ // check if the minor grid line and the minor axis arrow should be shown
+ bool minorGridLineVisible = (minorGridLineItemY >= gridGeometry().top()
+ && minorGridLineItemY <= gridGeometry().bottom());
+ minorGridLineItem->setVisible(minorGridLineVisible);
+ minorArrowLineItem->setVisible(minorGridLineVisible);
+ }
+ }
}
}
diff --git a/src/charts/chartpresenter.cpp b/src/charts/chartpresenter.cpp
index 6316e716..7b9e4275 100644
--- a/src/charts/chartpresenter.cpp
+++ b/src/charts/chartpresenter.cpp
@@ -79,25 +79,49 @@ ChartPresenter::~ChartPresenter()
#endif
}
+void ChartPresenter::setFixedGeometry(const QRectF &rect)
+{
+ if (rect == m_fixedRect)
+ return;
+ const bool isSame = m_fixedRect == m_rect;
+ m_fixedRect = rect;
+ if (m_fixedRect.isNull()) {
+ // Update to the latest geometry properly if changed
+ if (!isSame) {
+ updateGeometry(m_rect);
+ m_layout->updateGeometry();
+ }
+ } else {
+ updateGeometry(m_fixedRect);
+ }
+}
+
void ChartPresenter::setGeometry(const QRectF rect)
{
if (m_rect != rect) {
m_rect = rect;
- foreach (ChartItem *chart, m_chartItems) {
- chart->domain()->setSize(rect.size());
- chart->setPos(rect.topLeft());
- }
+ if (!m_fixedRect.isNull())
+ return;
+ updateGeometry(rect);
+ }
+}
+
+void ChartPresenter::updateGeometry(const QRectF &rect)
+{
+ foreach (ChartItem *chart, m_chartItems) {
+ chart->domain()->setSize(rect.size());
+ chart->setPos(rect.topLeft());
+ }
#ifndef QT_NO_OPENGL
- if (!m_glWidget.isNull())
- m_glWidget->setGeometry(m_rect.toRect());
+ if (!m_glWidget.isNull())
+ m_glWidget->setGeometry(rect.toRect());
#endif
- emit plotAreaChanged(m_rect);
- }
+ emit plotAreaChanged(rect);
}
QRectF ChartPresenter::geometry() const
{
- return m_rect;
+ return m_fixedRect.isNull() ? m_rect : m_fixedRect;
}
void ChartPresenter::handleAxisAdded(QAbstractAxis *axis)
@@ -135,8 +159,8 @@ void ChartPresenter::handleSeriesAdded(QAbstractSeries *series)
chart->setPresenter(this);
chart->setThemeManager(m_chart->d_ptr->m_themeManager);
chart->setDataSet(m_chart->d_ptr->m_dataset);
- chart->domain()->setSize(m_rect.size());
- chart->setPos(m_rect.topLeft());
+ chart->domain()->setSize(geometry().size());
+ chart->setPos(geometry().topLeft());
chart->handleDomainUpdated(); //this could be moved to intializeGraphics when animator is refactored
m_chartItems<<chart;
m_series<<series;
@@ -577,7 +601,7 @@ void ChartPresenter::updateGLWidget()
QGraphicsView *firstView = views.at(0);
m_glWidget = new GLWidget(m_chart->d_ptr->m_dataset->glXYSeriesDataManager(),
m_chart, firstView);
- m_glWidget->setGeometry(m_rect.toRect());
+ m_glWidget->setGeometry(geometry().toRect());
m_glWidget->show();
}
}
diff --git a/src/charts/chartpresenter_p.h b/src/charts/chartpresenter_p.h
index feda8558..122c3c4a 100644
--- a/src/charts/chartpresenter_p.h
+++ b/src/charts/chartpresenter_p.h
@@ -98,9 +98,11 @@ public:
ChartPresenter(QChart *chart, QChart::ChartType type);
virtual ~ChartPresenter();
-
+ bool isFixedGeometry() const { return !m_fixedRect.isNull(); }
+ void setFixedGeometry(const QRectF &rect);
void setGeometry(QRectF rect);
QRectF geometry() const;
+ void updateGeometry(const QRectF &rect);
QGraphicsItem *rootItem(){ return m_chart; }
ChartBackground *backgroundElement();
@@ -215,6 +217,7 @@ private:
QPointer<GLWidget> m_glWidget;
#endif
bool m_glUseWidget;
+ QRectF m_fixedRect;
};
QT_CHARTS_END_NAMESPACE
diff --git a/src/charts/doc/snippets/doc_src_qmlcharts.cpp b/src/charts/doc/snippets/doc_src_qmlcharts.cpp
index b087fa95..8d3b8822 100644
--- a/src/charts/doc/snippets/doc_src_qmlcharts.cpp
+++ b/src/charts/doc/snippets/doc_src_qmlcharts.cpp
@@ -28,5 +28,5 @@
****************************************************************************/
//! [0]
-import QtCharts 2.2
+import QtCharts 2.3
//! [0]
diff --git a/src/charts/doc/src/qtcharts.qdoc b/src/charts/doc/src/qtcharts.qdoc
index 60144016..4758de69 100644
--- a/src/charts/doc/src/qtcharts.qdoc
+++ b/src/charts/doc/src/qtcharts.qdoc
@@ -59,7 +59,7 @@
*/
/*!
- \qmlmodule QtCharts 2.2
+ \qmlmodule QtCharts 2.3
\title Qt Charts QML Types
\ingroup qmlmodules
diff --git a/src/charts/layout/abstractchartlayout.cpp b/src/charts/layout/abstractchartlayout.cpp
index ad3274a0..fd3c5e97 100644
--- a/src/charts/layout/abstractchartlayout.cpp
+++ b/src/charts/layout/abstractchartlayout.cpp
@@ -53,30 +53,33 @@ void AbstractChartLayout::setGeometry(const QRectF &rect)
{
if (!rect.isValid())
return;
-
+ // If the chart has a fixed geometry then don't update visually
+ const bool updateLayout = (!m_presenter->isFixedGeometry() || m_presenter->geometry() == rect);
if (m_presenter->chart()->isVisible()) {
QList<ChartAxisElement *> axes = m_presenter->axisItems();
ChartTitle *title = m_presenter->titleElement();
QLegend *legend = m_presenter->legend();
ChartBackground *background = m_presenter->backgroundElement();
- QRectF contentGeometry = calculateBackgroundGeometry(rect, background);
+ QRectF contentGeometry = calculateBackgroundGeometry(rect, background, updateLayout);
contentGeometry = calculateContentGeometry(contentGeometry);
if (title && title->isVisible())
- contentGeometry = calculateTitleGeometry(contentGeometry, title);
+ contentGeometry = calculateTitleGeometry(contentGeometry, title, updateLayout);
if (legend->isAttachedToChart() && legend->isVisible())
- contentGeometry = calculateLegendGeometry(contentGeometry, legend);
+ contentGeometry = calculateLegendGeometry(contentGeometry, legend, updateLayout);
- contentGeometry = calculateAxisGeometry(contentGeometry, axes);
+ contentGeometry = calculateAxisGeometry(contentGeometry, axes, updateLayout);
m_presenter->setGeometry(contentGeometry);
- if (m_presenter->chart()->chartType() == QChart::ChartTypeCartesian)
- static_cast<QGraphicsRectItem *>(m_presenter->plotAreaElement())->setRect(contentGeometry);
- else
- static_cast<QGraphicsEllipseItem *>(m_presenter->plotAreaElement())->setRect(contentGeometry);
+ if (updateLayout) {
+ if (m_presenter->chart()->chartType() == QChart::ChartTypeCartesian)
+ static_cast<QGraphicsRectItem *>(m_presenter->plotAreaElement())->setRect(contentGeometry);
+ else
+ static_cast<QGraphicsEllipseItem *>(m_presenter->plotAreaElement())->setRect(contentGeometry);
+ }
}
QGraphicsLayout::setGeometry(rect);
@@ -93,7 +96,9 @@ QRectF AbstractChartLayout::calculateContentMinimum(const QRectF &minimum) const
}
-QRectF AbstractChartLayout::calculateBackgroundGeometry(const QRectF &geometry, ChartBackground *background) const
+QRectF AbstractChartLayout::calculateBackgroundGeometry(const QRectF &geometry,
+ ChartBackground *background,
+ bool update) const
{
qreal left;
qreal top;
@@ -101,7 +106,7 @@ QRectF AbstractChartLayout::calculateBackgroundGeometry(const QRectF &geometry,
qreal bottom;
getContentsMargins(&left, &top, &right, &bottom);
QRectF backgroundGeometry = geometry.adjusted(left, top, -right, -bottom);
- if (background)
+ if (background && update)
background->setRect(backgroundGeometry);
return backgroundGeometry;
}
@@ -116,7 +121,8 @@ QRectF AbstractChartLayout::calculateBackgroundMinimum(const QRectF &minimum) co
return minimum.adjusted(0, 0, left + right, top + bottom);
}
-QRectF AbstractChartLayout::calculateLegendGeometry(const QRectF &geometry, QLegend *legend) const
+QRectF AbstractChartLayout::calculateLegendGeometry(const QRectF &geometry, QLegend *legend,
+ bool update) const
{
QSizeF size = legend->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1));
QRectF legendRect;
@@ -151,8 +157,8 @@ QRectF AbstractChartLayout::calculateLegendGeometry(const QRectF &geometry, QLeg
break;
}
}
-
- legend->setGeometry(legendRect);
+ if (update)
+ legend->setGeometry(legendRect);
return result;
}
@@ -167,16 +173,18 @@ QRectF AbstractChartLayout::calculateLegendMinimum(const QRectF &geometry, QLege
}
}
-QRectF AbstractChartLayout::calculateTitleGeometry(const QRectF &geometry, ChartTitle *title) const
+QRectF AbstractChartLayout::calculateTitleGeometry(const QRectF &geometry, ChartTitle *title,
+ bool update) const
{
- title->setGeometry(geometry);
+ if (update)
+ title->setGeometry(geometry);
if (title->text().isEmpty()) {
return geometry;
} else {
// Round to full pixel via QPoint to avoid one pixel clipping on the edge in some cases
QPointF center((geometry.center() - title->boundingRect().center()).toPoint());
-
- title->setPos(center.x(), title->pos().y());
+ if (update)
+ title->setPos(center.x(), title->pos().y());
return geometry.adjusted(0, title->boundingRect().height() + 1, 0, 0);
}
}
diff --git a/src/charts/layout/abstractchartlayout_p.h b/src/charts/layout/abstractchartlayout_p.h
index 6cb07f97..32d627a8 100644
--- a/src/charts/layout/abstractchartlayout_p.h
+++ b/src/charts/layout/abstractchartlayout_p.h
@@ -63,17 +63,23 @@ public:
virtual void setGeometry(const QRectF &rect);
protected:
- virtual QRectF calculateBackgroundGeometry(const QRectF &geometry, ChartBackground *background) const;
+ virtual QRectF calculateBackgroundGeometry(const QRectF &geometry, ChartBackground *background,
+ bool update = true) const;
virtual QRectF calculateBackgroundMinimum(const QRectF &minimum) const;
virtual QRectF calculateContentGeometry(const QRectF &geometry) const;
virtual QRectF calculateContentMinimum(const QRectF &minimum) const;
- virtual QRectF calculateTitleGeometry(const QRectF &geometry, ChartTitle *title) const;
+ virtual QRectF calculateTitleGeometry(const QRectF &geometry, ChartTitle *title,
+ bool update = true) const;
virtual QRectF calculateTitleMinimum(const QRectF &minimum, ChartTitle *title) const;
- virtual QRectF calculateLegendGeometry(const QRectF &geometry, QLegend *legend) const;
+ virtual QRectF calculateLegendGeometry(const QRectF &geometry, QLegend *legend,
+ bool update = true) const;
virtual QRectF calculateLegendMinimum(const QRectF &minimum, QLegend *legend) const;
- virtual QRectF calculateAxisGeometry(const QRectF &geometry, const QList<ChartAxisElement *>& axes) const = 0;
- virtual QRectF calculateAxisMinimum(const QRectF &minimum, const QList<ChartAxisElement *>& axes) const = 0;
+ virtual QRectF calculateAxisGeometry(const QRectF &geometry,
+ const QList<ChartAxisElement *>& axes,
+ bool update = true) const = 0;
+ virtual QRectF calculateAxisMinimum(const QRectF &minimum,
+ const QList<ChartAxisElement *>& axes) const = 0;
// from QGraphicsLayout
QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const;
diff --git a/src/charts/layout/cartesianchartlayout.cpp b/src/charts/layout/cartesianchartlayout.cpp
index 80a852a7..e8ce329a 100644
--- a/src/charts/layout/cartesianchartlayout.cpp
+++ b/src/charts/layout/cartesianchartlayout.cpp
@@ -45,7 +45,9 @@ CartesianChartLayout::~CartesianChartLayout()
{
}
-QRectF CartesianChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<ChartAxisElement *> &axes) const
+QRectF CartesianChartLayout::calculateAxisGeometry(const QRectF &geometry,
+ const QList<ChartAxisElement *> &axes,
+ bool update) const
{
QSizeF left(0,0);
QSizeF minLeft(0,0);
@@ -172,6 +174,11 @@ QRectF CartesianChartLayout::calculateAxisGeometry(const QRectF &geometry, const
qreal topOffset = 0;
qreal bottomOffset = 0;
+ // The axes are positioned here for the first time, so we need to catch any possible resizing
+ // of the chart when in fixed geometry to prevent them being moved out of place.
+ if (m_presenter->isFixedGeometry())
+ chartRect = m_presenter->geometry();
+
foreach (ChartAxisElement *axis , axes) {
if (!axis->isVisible())
diff --git a/src/charts/layout/cartesianchartlayout_p.h b/src/charts/layout/cartesianchartlayout_p.h
index d225e2af..81c47598 100644
--- a/src/charts/layout/cartesianchartlayout_p.h
+++ b/src/charts/layout/cartesianchartlayout_p.h
@@ -52,7 +52,8 @@ public:
// from AbstractChartLayout
QRectF calculateAxisMinimum(const QRectF &minimum, const QList<ChartAxisElement *> &axes) const;
- QRectF calculateAxisGeometry(const QRectF &geometry, const QList<ChartAxisElement *> &axes) const;
+ QRectF calculateAxisGeometry(const QRectF &geometry, const QList<ChartAxisElement *> &axes,
+ bool update = true) const;
};
QT_CHARTS_END_NAMESPACE
diff --git a/src/charts/layout/polarchartlayout.cpp b/src/charts/layout/polarchartlayout.cpp
index 5ff223ea..14071bd3 100644
--- a/src/charts/layout/polarchartlayout.cpp
+++ b/src/charts/layout/polarchartlayout.cpp
@@ -43,7 +43,9 @@ PolarChartLayout::~PolarChartLayout()
{
}
-QRectF PolarChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<ChartAxisElement *> &axes) const
+QRectF PolarChartLayout::calculateAxisGeometry(const QRectF &geometry,
+ const QList<ChartAxisElement *> &axes,
+ bool update) const
{
// How to handle multiple angular/radial axes?
qreal axisRadius = geometry.height() / 2.0;
@@ -74,8 +76,10 @@ QRectF PolarChartLayout::calculateAxisGeometry(const QRectF &geometry, const QLi
axisRect.moveCenter(geometry.center());
axisRect.adjust(0, titleHeight, 0, titleHeight);
- foreach (ChartAxisElement *chartAxis, axes)
- chartAxis->setGeometry(axisRect, QRectF());
+ if (update) {
+ foreach (ChartAxisElement *chartAxis, axes)
+ chartAxis->setGeometry(axisRect, QRectF());
+ }
return axisRect;
}
diff --git a/src/charts/layout/polarchartlayout_p.h b/src/charts/layout/polarchartlayout_p.h
index 597c4a3c..18c1be34 100644
--- a/src/charts/layout/polarchartlayout_p.h
+++ b/src/charts/layout/polarchartlayout_p.h
@@ -52,7 +52,8 @@ public:
// from AbstractChartLayout
QRectF calculateAxisMinimum(const QRectF &minimum, const QList<ChartAxisElement *> &axes) const;
- QRectF calculateAxisGeometry(const QRectF &geometry, const QList<ChartAxisElement *> &axes) const;
+ QRectF calculateAxisGeometry(const QRectF &geometry, const QList<ChartAxisElement *> &axes,
+ bool update = true) const;
};
QT_CHARTS_END_NAMESPACE
diff --git a/src/charts/linechart/linechartitem.cpp b/src/charts/linechart/linechartitem.cpp
index f41e5bc2..f31c69b4 100644
--- a/src/charts/linechart/linechartitem.cpp
+++ b/src/charts/linechart/linechartitem.cpp
@@ -406,7 +406,9 @@ void LineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt
painter->drawPath(m_linePath);
} else {
painter->setBrush(QBrush(Qt::NoBrush));
- if (m_linePen.style() != Qt::SolidLine || alwaysUsePath) {
+ if (m_linePen.style() != Qt::SolidLine
+ || painter->renderHints().testFlag(QPainter::Antialiasing)
+ || alwaysUsePath) {
// If pen style is not solid line, always fall back to path painting
// to ensure proper continuity of the pattern
painter->drawPath(m_linePath);
diff --git a/src/charts/qchart.cpp b/src/charts/qchart.cpp
index ca483a94..09090185 100644
--- a/src/charts/qchart.cpp
+++ b/src/charts/qchart.cpp
@@ -223,7 +223,9 @@ QT_CHARTS_BEGIN_NAMESPACE
\property QChart::plotArea
\brief The rectangle within which the chart is drawn.
- The plot area does not include the area defined by margins.
+ The plot area does not include the area defined by margins. By default this will resize if inside
+ a QChartView. If an explicit size is set for the plot area then it will respect this, to revert
+ back to the default behavior, then calling \c{setPlotArea(QRectF());} will achieve this.
*/
/*!
@@ -583,6 +585,11 @@ QRectF QChart::plotArea() const
return d_ptr->m_presenter->geometry();
}
+void QChart::setPlotArea(const QRectF &rect)
+{
+ d_ptr->m_presenter->setFixedGeometry(rect);
+}
+
/*!
Sets the brush used to fill the background of the plot area of the chart to \a brush.
diff --git a/src/charts/qchart.h b/src/charts/qchart.h
index a193ba22..9ac70e45 100644
--- a/src/charts/qchart.h
+++ b/src/charts/qchart.h
@@ -63,7 +63,7 @@ class QT_CHARTS_EXPORT QChart : public QGraphicsWidget
Q_PROPERTY(bool plotAreaBackgroundVisible READ isPlotAreaBackgroundVisible WRITE setPlotAreaBackgroundVisible)
Q_PROPERTY(bool localizeNumbers READ localizeNumbers WRITE setLocalizeNumbers)
Q_PROPERTY(QLocale locale READ locale WRITE setLocale)
- Q_PROPERTY(QRectF plotArea READ plotArea NOTIFY plotAreaChanged)
+ Q_PROPERTY(QRectF plotArea READ plotArea WRITE setPlotArea NOTIFY plotAreaChanged)
Q_ENUMS(ChartTheme)
Q_ENUMS(AnimationOption)
Q_ENUMS(ChartType)
@@ -104,12 +104,10 @@ public:
void removeAllSeries();
QList<QAbstractSeries *> series() const;
- // *** deprecated ***
- void setAxisX(QAbstractAxis *axis, QAbstractSeries *series = nullptr);
- void setAxisY(QAbstractAxis *axis, QAbstractSeries *series = nullptr);
- QAbstractAxis *axisX(QAbstractSeries *series = nullptr) const;
- QAbstractAxis *axisY(QAbstractSeries *series = nullptr) const;
- // ******************
+ Q_DECL_DEPRECATED void setAxisX(QAbstractAxis *axis, QAbstractSeries *series = nullptr);
+ Q_DECL_DEPRECATED void setAxisY(QAbstractAxis *axis, QAbstractSeries *series = nullptr);
+ Q_DECL_DEPRECATED QAbstractAxis *axisX(QAbstractSeries *series = nullptr) const;
+ Q_DECL_DEPRECATED QAbstractAxis *axisY(QAbstractSeries *series = nullptr) const;
void addAxis(QAbstractAxis *axis, Qt::Alignment alignment);
void removeAxis(QAbstractAxis *axis);
@@ -162,6 +160,7 @@ public:
QMargins margins() const;
QRectF plotArea() const;
+ void setPlotArea(const QRectF &rect);
void setPlotAreaBackgroundBrush(const QBrush &brush);
QBrush plotAreaBackgroundBrush() const;
void setPlotAreaBackgroundPen(const QPen &pen);
diff --git a/src/charts/qchartview.cpp b/src/charts/qchartview.cpp
index 540a91e0..d9c12994 100644
--- a/src/charts/qchartview.cpp
+++ b/src/charts/qchartview.cpp
@@ -130,7 +130,7 @@ void QChartView::setRubberBand(const RubberBands &rubberBand)
if (!d_ptr->m_rubberBandFlags) {
delete d_ptr->m_rubberBand;
- d_ptr->m_rubberBand = 0;
+ d_ptr->m_rubberBand = nullptr;
return;
}
@@ -277,7 +277,7 @@ QChartViewPrivate::QChartViewPrivate(QChartView *q, QChart *chart)
m_scene(new QGraphicsScene(q)),
m_chart(chart),
#ifndef QT_NO_RUBBERBAND
- m_rubberBand(0),
+ m_rubberBand(nullptr),
#endif
m_rubberBandFlags(QChartView::NoRubberBand)
{
@@ -331,7 +331,8 @@ void QChartViewPrivate::resize()
}
m_chart->resize(chartSize);
- q_ptr->setMinimumSize(m_chart->minimumSize().toSize());
+ q_ptr->setMinimumSize(m_chart->minimumSize().toSize().expandedTo(q_ptr->minimumSize()));
+ q_ptr->setMaximumSize(q_ptr->maximumSize().boundedTo(m_chart->maximumSize().toSize()));
q_ptr->setSceneRect(m_chart->geometry());
}
diff --git a/src/charts/xychart/glxyseriesdata.cpp b/src/charts/xychart/glxyseriesdata.cpp
index 54c533b2..8ec919b7 100644
--- a/src/charts/xychart/glxyseriesdata.cpp
+++ b/src/charts/xychart/glxyseriesdata.cpp
@@ -117,20 +117,26 @@ void GLXYSeriesDataManager::setPoints(QXYSeries *series, const AbstractDomain *d
data->min = QVector2D(0, 0);
data->delta = QVector2D(domain->size().width() / 2.0f, domain->size().height() / 2.0f);
} else {
- // Regular value axes, so we can do the math easily on shaders.
+ // Regular value axes, so we can optimize it a bit.
if (reverseX)
matrix.scale(-1.0, 1.0);
if (reverseY)
matrix.scale(1.0, -1.0);
- QVector<QPointF> seriesPoints = series->pointsVector();
- for (int i = 0; i < count; i++) {
- const QPointF &point = seriesPoints.at(i);
- array[index++] = float(point.x());
- array[index++] = float(point.y());
+
+ const qreal mx = domain->minX();
+ const qreal my = domain->minY();
+ const qreal xd = domain->maxX() - mx;
+ const qreal yd = domain->maxY() - my;
+
+ if (!qFuzzyIsNull(xd) && !qFuzzyIsNull(yd)) {
+ const QVector<QPointF> seriesPoints = series->pointsVector();
+ for (const QPointF &point : seriesPoints) {
+ array[index++] = float((point.x() - mx) / xd);
+ array[index++] = float((point.y() - my) / yd);
+ }
}
- data->min = QVector2D(domain->minX(), domain->minY());
- data->delta = QVector2D((domain->maxX() - domain->minX()) / 2.0f,
- (domain->maxY() - domain->minY()) / 2.0f);
+ data->min = QVector2D(0.0f, 0.0f);
+ data->delta = QVector2D(0.5f, 0.5f);
}
data->matrix = matrix;
data->dirty = true;
diff --git a/src/chartsqml2/chartsqml2.pro b/src/chartsqml2/chartsqml2.pro
index 57b3bd37..562e02b8 100644
--- a/src/chartsqml2/chartsqml2.pro
+++ b/src/chartsqml2/chartsqml2.pro
@@ -56,6 +56,9 @@ contains(QT_CONFIG, opengl) {
HEADERS += $$PRIVATE_HEADERS
INCLUDEPATH += $$PWD
+IMPORT_VERSION = 2.3
+QMAKE_QMLPLUGINDUMP_FLAGS = -qapp
+
load(qml_plugin)
win32 {
diff --git a/src/chartsqml2/chartsqml2_plugin.cpp b/src/chartsqml2/chartsqml2_plugin.cpp
index b1a9d412..3720a0a8 100644
--- a/src/chartsqml2/chartsqml2_plugin.cpp
+++ b/src/chartsqml2/chartsqml2_plugin.cpp
@@ -139,13 +139,6 @@ QML_DECLARE_TYPE(QScatterSeries)
QML_DECLARE_TYPE(QSplineSeries)
QML_DECLARE_TYPE(QStackedBarSeries)
-static void initResources()
-{
-#ifdef QT_STATIC
- Q_INIT_RESOURCE(qmake_QtCharts);
-#endif
-}
-
QT_CHARTS_BEGIN_NAMESPACE
class QtChartsQml2Plugin : public QQmlExtensionPlugin
@@ -155,7 +148,7 @@ class QtChartsQml2Plugin : public QQmlExtensionPlugin
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
- QtChartsQml2Plugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); }
+ QtChartsQml2Plugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { }
virtual void registerTypes(const char *uri)
{
Q_ASSERT(QLatin1String(uri) == QLatin1String("QtCharts"));
@@ -350,6 +343,9 @@ public:
QLatin1String("Trying to create uncreatable: CandlestickModelMapper."));
qmlRegisterType<QHCandlestickModelMapper>(uri, 2, 2, "HCandlestickModelMapper");
qmlRegisterType<QVCandlestickModelMapper>(uri, 2, 2, "VCandlestickModelMapper");
+
+ // QtCharts 2.3
+ qmlRegisterType<QValueAxis, 1>(uri, 2, 3, "ValueAxis");
}
};
diff --git a/src/chartsqml2/declarativechart.cpp b/src/chartsqml2/declarativechart.cpp
index 4782f3a4..11677667 100644
--- a/src/chartsqml2/declarativechart.cpp
+++ b/src/chartsqml2/declarativechart.cpp
@@ -211,7 +211,9 @@ QT_CHARTS_BEGIN_NAMESPACE
\qmlproperty rect ChartView::plotArea
The rectangle within which the chart is drawn.
- The plot area does not include the area defined by margins.
+ The plot area does not include the area defined by margins. By default this will resize if inside
+ a ChartView. If an explicit rectangle is set for the plot area then it will respect this, to revert
+ back to the default behavior, then setting it to \c{Qt.rect(0, 0, 0, 0)} will achieve this.
\sa margins
*/
@@ -1469,6 +1471,11 @@ QPointF DeclarativeChart::mapToPosition(const QPointF &value, QAbstractSeries *s
return m_chart->mapToPosition(value, series);
}
+void DeclarativeChart::setPlotArea(const QRectF &rect)
+{
+ m_chart->setPlotArea(rect);
+}
+
#include "moc_declarativechart_p.cpp"
QT_CHARTS_END_NAMESPACE
diff --git a/src/chartsqml2/declarativechart_p.h b/src/chartsqml2/declarativechart_p.h
index dd619214..a8441d87 100644
--- a/src/chartsqml2/declarativechart_p.h
+++ b/src/chartsqml2/declarativechart_p.h
@@ -73,7 +73,7 @@ class QT_QMLCHARTS_PRIVATE_EXPORT DeclarativeChart : public QQuickItem
Q_PROPERTY(bool dropShadowEnabled READ dropShadowEnabled WRITE setDropShadowEnabled NOTIFY dropShadowEnabledChanged)
Q_PROPERTY(qreal backgroundRoundness READ backgroundRoundness WRITE setBackgroundRoundness NOTIFY backgroundRoundnessChanged REVISION 3)
Q_PROPERTY(QtCharts::DeclarativeMargins *margins READ margins NOTIFY marginsChanged REVISION 2)
- Q_PROPERTY(QRectF plotArea READ plotArea NOTIFY plotAreaChanged REVISION 1)
+ Q_PROPERTY(QRectF plotArea READ plotArea WRITE setPlotArea NOTIFY plotAreaChanged REVISION 1)
Q_PROPERTY(QColor plotAreaColor READ plotAreaColor WRITE setPlotAreaColor NOTIFY plotAreaColorChanged REVISION 3)
Q_PROPERTY(QQmlListProperty<QAbstractAxis> axes READ axes REVISION 2)
Q_PROPERTY(bool localizeNumbers READ localizeNumbers WRITE setLocalizeNumbers NOTIFY localizeNumbersChanged REVISION 4)
@@ -171,6 +171,7 @@ public:
// Margins & plotArea
DeclarativeMargins *margins() { return m_margins; }
QRectF plotArea() { return m_chart->plotArea(); }
+ void setPlotArea(const QRectF &rect);
// Axis handling
QAbstractAxis *defaultAxis(Qt::Orientation orientation, QAbstractSeries *series);
diff --git a/src/chartsqml2/designer/qtcharts.metainfo b/src/chartsqml2/designer/qtcharts.metainfo
index dad6e530..6c51ab04 100644
--- a/src/chartsqml2/designer/qtcharts.metainfo
+++ b/src/chartsqml2/designer/qtcharts.metainfo
@@ -1,6 +1,6 @@
MetaInfo {
Type {
- name: "QtCharts.AreaSeries"
+ name: "QtCharts.ChartView"
icon: "images/areaseries-chart-icon16.png"
ItemLibraryEntry {
@@ -14,7 +14,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.BarSeries"
+ name: "QtCharts.ChartView"
icon: "images/barseries-icon16.png"
ItemLibraryEntry {
@@ -28,7 +28,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.BoxPlotSeries"
+ name: "QtCharts.ChartView"
icon: "images/boxplotseries-chart-icon16.png"
ItemLibraryEntry {
@@ -42,7 +42,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.HorizontalBarSeries"
+ name: "QtCharts.ChartView"
icon: "images/horizontalbarseries-icon16.png"
ItemLibraryEntry {
@@ -56,7 +56,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.HorizontalPercentBarSeries"
+ name: "QtCharts.ChartView"
icon: "images/horizontalpercentbarseries-icon16.png"
ItemLibraryEntry {
@@ -70,7 +70,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.HorizontalStackedBarSeries"
+ name: "QtCharts.ChartView"
icon: "images/horizontalstackedbarseries-icon16.png"
ItemLibraryEntry {
@@ -84,7 +84,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.LineSeries"
+ name: "QtCharts.ChartView"
icon: "images/lineseries-chart-icon16.png"
ItemLibraryEntry {
@@ -98,7 +98,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.PercentBarSeries"
+ name: "QtCharts.ChartView"
icon: "images/percentbarseries-icon16.png"
ItemLibraryEntry {
@@ -112,7 +112,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.PieSeries"
+ name: "QtCharts.ChartView"
icon: "images/pieseries-chart-icon16.png"
ItemLibraryEntry {
@@ -126,7 +126,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.ScatterSeries"
+ name: "QtCharts.ChartView"
icon: "images/scatterseries-chart-icon16.png"
ItemLibraryEntry {
@@ -140,7 +140,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.SplineSeries"
+ name: "QtCharts.ChartView"
icon: "images/splineseries-chart-icon16.png"
ItemLibraryEntry {
@@ -154,7 +154,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.StackedBarSeries"
+ name: "QtCharts.ChartView"
icon: "images/stackedbarseries-icon16.png"
ItemLibraryEntry {
@@ -169,7 +169,7 @@ MetaInfo {
}
Type {
- name: "QtCharts.AreaSeries"
+ name: "QtCharts.ChartView"
icon: "images/areaseries-polar-icon16.png"
ItemLibraryEntry {
@@ -183,7 +183,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.LineSeries"
+ name: "QtCharts.ChartView"
icon: "images/lineseries-polar-icon16.png"
ItemLibraryEntry {
@@ -197,7 +197,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.ScatterSeries"
+ name: "QtCharts.ChartView"
icon: "images/scatterseries-polar-icon16.png"
ItemLibraryEntry {
@@ -211,7 +211,7 @@ MetaInfo {
}
}
Type {
- name: "QtCharts.SplineSeries"
+ name: "QtCharts.ChartView"
icon: "images/splineseries-polar-icon16.png"
ItemLibraryEntry {
diff --git a/src/chartsqml2/plugins.qmltypes b/src/chartsqml2/plugins.qmltypes
index 18a1ae2d..2b2a3e47 100644
--- a/src/chartsqml2/plugins.qmltypes
+++ b/src/chartsqml2/plugins.qmltypes
@@ -4,10 +4,10 @@ import QtQuick.tooling 1.2
// It is used for QML tooling purposes only.
//
// This file was auto-generated by:
-// 'qmlplugindump -nonrelocatable -qapp QtCharts 2.2'
+// 'qmlplugindump -nonrelocatable -qapp QtCharts 2.3'
Module {
- dependencies: ["QtQuick 2.8"]
+ dependencies: ["QtQuick 2.12"]
Component {
name: "QGraphicsObject"
defaultProperty: "children"
@@ -64,14 +64,14 @@ Module {
"QtCharts/AreaSeries 2.0"
]
exportMetaObjectRevisions: [0, 1, 2, 3, 4, 4]
- Property { name: "upperSeries"; type: "QtCharts::DeclarativeLineSeries"; isPointer: true }
- Property { name: "lowerSeries"; type: "QtCharts::DeclarativeLineSeries"; isPointer: true }
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisAngular"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisRadial"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "upperSeries"; type: "DeclarativeLineSeries"; isPointer: true }
+ Property { name: "lowerSeries"; type: "DeclarativeLineSeries"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisAngular"; revision: 3; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisRadial"; revision: 3; type: "QAbstractAxis"; isPointer: true }
Property { name: "borderWidth"; revision: 1; type: "double" }
Property { name: "brushFilename"; revision: 4; type: "string" }
Property { name: "brush"; revision: 4; type: "QBrush" }
@@ -126,10 +126,10 @@ Module {
]
isCreatable: false
exportMetaObjectRevisions: [0, 0]
- Property { name: "axisX"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; type: "QAbstractAxis"; isPointer: true }
Signal {
name: "axisXChanged"
Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
@@ -158,10 +158,10 @@ Module {
"QtCharts/BarSeries 2.0"
]
exportMetaObjectRevisions: [0, 1, 2, 2]
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
Signal {
name: "axisXChanged"
@@ -275,10 +275,10 @@ Module {
"QtCharts/BoxPlotSeries 2.0"
]
exportMetaObjectRevisions: [0, 1, 1]
- Property { name: "axisX"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; type: "QAbstractAxis"; isPointer: true }
Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
Property { name: "brushFilename"; revision: 1; type: "string" }
Signal {
@@ -433,10 +433,10 @@ Module {
prototype: "QtCharts::QCandlestickSeries"
exports: ["QtCharts/CandlestickSeries 2.2"]
exportMetaObjectRevisions: [0]
- Property { name: "axisX"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; type: "QAbstractAxis"; isPointer: true }
Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
Property { name: "brushFilename"; type: "string" }
Signal {
@@ -666,7 +666,7 @@ Module {
Property { name: "title"; type: "string" }
Property { name: "titleFont"; type: "QFont" }
Property { name: "titleColor"; type: "QColor" }
- Property { name: "legend"; type: "QtCharts::QLegend"; isReadonly: true; isPointer: true }
+ Property { name: "legend"; type: "QLegend"; isReadonly: true; isPointer: true }
Property { name: "count"; type: "int"; isReadonly: true }
Property { name: "backgroundColor"; type: "QColor" }
Property { name: "dropShadowEnabled"; type: "bool" }
@@ -674,11 +674,11 @@ Module {
Property {
name: "margins"
revision: 2
- type: "QtCharts::DeclarativeMargins"
+ type: "DeclarativeMargins"
isReadonly: true
isPointer: true
}
- Property { name: "plotArea"; revision: 1; type: "QRectF"; isReadonly: true }
+ Property { name: "plotArea"; revision: 1; type: "QRectF" }
Property { name: "plotAreaColor"; revision: 3; type: "QColor" }
Property { name: "axes"; revision: 2; type: "QAbstractAxis"; isList: true; isReadonly: true }
Property { name: "localizeNumbers"; revision: 4; type: "bool" }
@@ -862,10 +862,10 @@ Module {
"QtCharts/HorizontalBarSeries 2.0"
]
exportMetaObjectRevisions: [1, 2, 2]
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
Signal {
name: "axisXChanged"
@@ -927,10 +927,10 @@ Module {
"QtCharts/HorizontalPercentBarSeries 2.0"
]
exportMetaObjectRevisions: [1, 2, 2]
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
Signal {
name: "axisXChanged"
@@ -992,10 +992,10 @@ Module {
"QtCharts/HorizontalStackedBarSeries 2.0"
]
exportMetaObjectRevisions: [1, 2, 2]
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
Signal {
name: "axisXChanged"
@@ -1061,12 +1061,12 @@ Module {
]
exportMetaObjectRevisions: [0, 1, 2, 3, 3, 4]
Property { name: "count"; type: "int"; isReadonly: true }
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisAngular"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisRadial"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisAngular"; revision: 3; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisRadial"; revision: 3; type: "QAbstractAxis"; isPointer: true }
Property { name: "width"; revision: 1; type: "double" }
Property { name: "style"; revision: 1; type: "Qt::PenStyle" }
Property { name: "capStyle"; revision: 1; type: "Qt::PenCapStyle" }
@@ -1227,10 +1227,10 @@ Module {
"QtCharts/PercentBarSeries 2.0"
]
exportMetaObjectRevisions: [0, 1, 2, 2]
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
Signal {
name: "axisXChanged"
@@ -1373,12 +1373,12 @@ Module {
]
exportMetaObjectRevisions: [0, 1, 2, 3, 4, 4, 5]
Property { name: "count"; type: "int"; isReadonly: true }
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisAngular"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisRadial"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisAngular"; revision: 3; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisRadial"; revision: 3; type: "QAbstractAxis"; isPointer: true }
Property { name: "borderWidth"; revision: 1; type: "double" }
Property { name: "declarativeChildren"; type: "QObject"; isList: true; isReadonly: true }
Property { name: "brushFilename"; revision: 4; type: "string" }
@@ -1499,12 +1499,12 @@ Module {
]
exportMetaObjectRevisions: [0, 1, 2, 3, 3, 4]
Property { name: "count"; type: "int"; isReadonly: true }
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisAngular"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisRadial"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisAngular"; revision: 3; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisRadial"; revision: 3; type: "QAbstractAxis"; isPointer: true }
Property { name: "width"; revision: 1; type: "double" }
Property { name: "style"; revision: 1; type: "Qt::PenStyle" }
Property { name: "capStyle"; revision: 1; type: "Qt::PenCapStyle" }
@@ -1626,10 +1626,10 @@ Module {
"QtCharts/StackedBarSeries 2.0"
]
exportMetaObjectRevisions: [0, 1, 2, 2]
- Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
- Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+ Property { name: "axisX"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisY"; revision: 1; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisXTop"; revision: 2; type: "QAbstractAxis"; isPointer: true }
+ Property { name: "axisYRight"; revision: 2; type: "QAbstractAxis"; isPointer: true }
Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
Signal {
name: "axisXChanged"
@@ -1944,8 +1944,8 @@ Module {
Component {
name: "QtCharts::QAreaSeries"
prototype: "QtCharts::QAbstractSeries"
- Property { name: "upperSeries"; type: "QtCharts::QLineSeries"; isReadonly: true; isPointer: true }
- Property { name: "lowerSeries"; type: "QtCharts::QLineSeries"; isReadonly: true; isPointer: true }
+ Property { name: "upperSeries"; type: "QLineSeries"; isReadonly: true; isPointer: true }
+ Property { name: "lowerSeries"; type: "QLineSeries"; isReadonly: true; isPointer: true }
Property { name: "color"; type: "QColor" }
Property { name: "borderColor"; type: "QColor" }
Property { name: "pointLabelsFormat"; type: "string" }
@@ -2178,7 +2178,7 @@ Module {
isCreatable: false
exportMetaObjectRevisions: [0]
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
- Property { name: "series"; type: "QtCharts::QCandlestickSeries"; isPointer: true }
+ Property { name: "series"; type: "QCandlestickSeries"; isPointer: true }
Signal { name: "modelReplaced" }
Signal { name: "seriesReplaced" }
}
@@ -2260,7 +2260,7 @@ Module {
Property { name: "startValue"; type: "double" }
Property { name: "count"; type: "int"; isReadonly: true }
Property { name: "categoriesLabels"; type: "QStringList"; isReadonly: true }
- Property { name: "labelsPosition"; type: "QCategoryAxis::AxisLabelsPosition" }
+ Property { name: "labelsPosition"; type: "AxisLabelsPosition" }
Signal { name: "categoriesChanged" }
Signal {
name: "labelsPositionChanged"
@@ -2306,7 +2306,7 @@ Module {
"QtCharts/HBarModelMapper 2.0"
]
exportMetaObjectRevisions: [0, 0]
- Property { name: "series"; type: "QtCharts::QAbstractBarSeries"; isPointer: true }
+ Property { name: "series"; type: "QAbstractBarSeries"; isPointer: true }
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
Property { name: "firstBarSetRow"; type: "int" }
Property { name: "lastBarSetRow"; type: "int" }
@@ -2320,7 +2320,7 @@ Module {
prototype: "QtCharts::QBoxPlotModelMapper"
exports: ["QtCharts/HBoxPlotModelMapper 2.0"]
exportMetaObjectRevisions: [0]
- Property { name: "series"; type: "QtCharts::QBoxPlotSeries"; isPointer: true }
+ Property { name: "series"; type: "QBoxPlotSeries"; isPointer: true }
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
Property { name: "firstBoxSetRow"; type: "int" }
Property { name: "lastBoxSetRow"; type: "int" }
@@ -2350,7 +2350,7 @@ Module {
"QtCharts/HPieModelMapper 2.0"
]
exportMetaObjectRevisions: [0, 0]
- Property { name: "series"; type: "QtCharts::QPieSeries"; isPointer: true }
+ Property { name: "series"; type: "QPieSeries"; isPointer: true }
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
Property { name: "valuesRow"; type: "int" }
Property { name: "labelsRow"; type: "int" }
@@ -2367,7 +2367,7 @@ Module {
"QtCharts/HXYModelMapper 2.0"
]
exportMetaObjectRevisions: [0, 0]
- Property { name: "series"; type: "QtCharts::QXYSeries"; isPointer: true }
+ Property { name: "series"; type: "QXYSeries"; isPointer: true }
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
Property { name: "xRow"; type: "int" }
Property { name: "yRow"; type: "int" }
@@ -2623,7 +2623,7 @@ Module {
"QtCharts/VBarModelMapper 2.0"
]
exportMetaObjectRevisions: [0, 0]
- Property { name: "series"; type: "QtCharts::QAbstractBarSeries"; isPointer: true }
+ Property { name: "series"; type: "QAbstractBarSeries"; isPointer: true }
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
Property { name: "firstBarSetColumn"; type: "int" }
Property { name: "lastBarSetColumn"; type: "int" }
@@ -2637,7 +2637,7 @@ Module {
prototype: "QtCharts::QBoxPlotModelMapper"
exports: ["QtCharts/VBoxPlotModelMapper 2.0"]
exportMetaObjectRevisions: [0]
- Property { name: "series"; type: "QtCharts::QBoxPlotSeries"; isPointer: true }
+ Property { name: "series"; type: "QBoxPlotSeries"; isPointer: true }
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
Property { name: "firstBoxSetColumn"; type: "int" }
Property { name: "lastBoxSetColumn"; type: "int" }
@@ -2667,7 +2667,7 @@ Module {
"QtCharts/VPieModelMapper 2.0"
]
exportMetaObjectRevisions: [0, 0]
- Property { name: "series"; type: "QtCharts::QPieSeries"; isPointer: true }
+ Property { name: "series"; type: "QPieSeries"; isPointer: true }
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
Property { name: "valuesColumn"; type: "int" }
Property { name: "labelsColumn"; type: "int" }
@@ -2684,7 +2684,7 @@ Module {
"QtCharts/VXYModelMapper 2.0"
]
exportMetaObjectRevisions: [0, 0]
- Property { name: "series"; type: "QtCharts::QXYSeries"; isPointer: true }
+ Property { name: "series"; type: "QXYSeries"; isPointer: true }
Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
Property { name: "xColumn"; type: "int" }
Property { name: "yColumn"; type: "int" }
@@ -2699,14 +2699,25 @@ Module {
exports: [
"QtCharts/ValueAxis 1.1",
"QtCharts/ValueAxis 2.0",
+ "QtCharts/ValueAxis 2.3",
"QtCharts/ValuesAxis 1.0"
]
- exportMetaObjectRevisions: [0, 0, 0]
+ exportMetaObjectRevisions: [0, 0, 1, 0]
+ Enum {
+ name: "TickType"
+ values: {
+ "TicksDynamic": 0,
+ "TicksFixed": 1
+ }
+ }
Property { name: "tickCount"; type: "int" }
Property { name: "min"; type: "double" }
Property { name: "max"; type: "double" }
Property { name: "labelFormat"; type: "string" }
Property { name: "minorTickCount"; type: "int" }
+ Property { name: "tickAnchor"; revision: 1; type: "double" }
+ Property { name: "tickInterval"; revision: 1; type: "double" }
+ Property { name: "tickType"; revision: 1; type: "TickType" }
Signal {
name: "minChanged"
Parameter { name: "min"; type: "double" }
@@ -2732,6 +2743,21 @@ Module {
name: "labelFormatChanged"
Parameter { name: "format"; type: "string" }
}
+ Signal {
+ name: "tickIntervalChanged"
+ revision: 1
+ Parameter { name: "interval"; type: "double" }
+ }
+ Signal {
+ name: "tickAnchorChanged"
+ revision: 1
+ Parameter { name: "anchor"; type: "double" }
+ }
+ Signal {
+ name: "tickTypeChanged"
+ revision: 1
+ Parameter { name: "type"; type: "QValueAxis::TickType" }
+ }
Method { name: "applyNiceNumbers" }
}
Component {
diff --git a/tests/auto/qchart/tst_qchart.cpp b/tests/auto/qchart/tst_qchart.cpp
index a4debfd7..da94bbda 100644
--- a/tests/auto/qchart/tst_qchart.cpp
+++ b/tests/auto/qchart/tst_qchart.cpp
@@ -125,6 +125,7 @@ private slots:
void backgroundRoundness();
void zoomInAndOut_data();
void zoomInAndOut();
+ void fixedPlotArea();
private:
void createTestData();
@@ -1200,6 +1201,24 @@ void tst_QChart::zoomInAndOut()
CHECK_AXIS_RANGES_MATCH
}
+void tst_QChart::fixedPlotArea()
+{
+ createTestData();
+ const QRectF originalPlotArea = m_chart->plotArea();
+ m_chart->setPlotArea(originalPlotArea);
+ QCOMPARE(m_chart->plotArea(), originalPlotArea);
+ m_view->resize(400, 400);
+ // Should still be the same size
+ QCOMPARE(m_chart->plotArea(), originalPlotArea);
+ m_chart->setPlotArea(QRectF());
+ // Should still be the same size as we have not triggered an update
+ QCOMPARE(m_chart->plotArea(), originalPlotArea);
+ m_view->resize(401, 401);
+ QVERIFY(m_chart->plotArea() != originalPlotArea);
+ m_chart->setPlotArea(originalPlotArea);
+ QCOMPARE(m_chart->plotArea(), originalPlotArea);
+}
+
QTEST_MAIN(tst_QChart)
#include "tst_qchart.moc"
diff --git a/tests/auto/qvalueaxis/tst_qvalueaxis.cpp b/tests/auto/qvalueaxis/tst_qvalueaxis.cpp
index d865b9c2..d1dabd3e 100644
--- a/tests/auto/qvalueaxis/tst_qvalueaxis.cpp
+++ b/tests/auto/qvalueaxis/tst_qvalueaxis.cpp
@@ -70,6 +70,7 @@ private slots:
void autoscale();
void reverse();
void labels();
+ void dynamicTicks();
private:
QValueAxis* m_valuesaxis;
@@ -462,6 +463,43 @@ void tst_QValueAxis::labels()
QCOMPARE(originalStrings, updatedStrings);
}
+void tst_QValueAxis::dynamicTicks()
+{
+ QValueAxis *valuesaxis = new QValueAxis();
+ m_chart->setAxisX(m_valuesaxis, m_series);
+ m_chart->setAxisY(valuesaxis, m_series);
+ m_view->resize(400, 400);
+ m_valuesaxis->setRange(-111.0, 111);
+ m_valuesaxis->setTickType(QValueAxis::TicksDynamic);
+ m_valuesaxis->setTickAnchor(100.0);
+ m_valuesaxis->setTickInterval(100.0);
+ valuesaxis->setRange(-111.0, 111);
+ valuesaxis->setTickType(QValueAxis::TicksDynamic);
+ valuesaxis->setTickAnchor(100.0);
+ valuesaxis->setTickInterval(50.0);
+ valuesaxis->setLabelFormat("%.2f");
+ m_view->show();
+ QTest::qWaitForWindowShown(m_view);
+
+ QStringList expectedList;
+ expectedList << "" << "100.00" << "50.00" << "0.00" << "-50.00" << "-100.00" <<
+ "100.0" << "0.0" << "-100.0";
+
+ QList<QGraphicsItem *> childItems = m_chart->scene()->items();
+ QList<QGraphicsTextItem *> textItems;
+ QStringList observedStrings;
+ for (QGraphicsItem *i : childItems) {
+ if (QGraphicsTextItem *text = qgraphicsitem_cast<QGraphicsTextItem *>(i)) {
+ if (text->parentItem() != m_chart) {
+ textItems << text;
+ observedStrings << text->toPlainText();
+ }
+ }
+ }
+
+ QCOMPARE(expectedList, observedStrings);
+}
+
QTEST_MAIN(tst_QValueAxis)
#include "tst_qvalueaxis.moc"