diff options
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 [°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 [°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" |