diff options
-rw-r--r-- | dist/changes-2.1.3 | 5 | ||||
-rw-r--r-- | dist/changes-5.9.2 | 25 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/qvalueaxis.cpp | 16 | ||||
-rw-r--r-- | src/charts/xychart/qxyseries.cpp | 6 | ||||
-rw-r--r-- | src/chartsqml2/declarativeopenglrendernode.cpp | 29 | ||||
-rw-r--r-- | tests/auto/qchart/tst_qchart.cpp | 112 | ||||
-rw-r--r-- | tests/auto/qvalueaxis/tst_qvalueaxis.cpp | 1 | ||||
-rw-r--r-- | tests/manual/chartwidgettest/mainwidget.cpp | 3 |
8 files changed, 179 insertions, 18 deletions
diff --git a/dist/changes-2.1.3 b/dist/changes-2.1.3 new file mode 100644 index 00000000..0cdc45cb --- /dev/null +++ b/dist/changes-2.1.3 @@ -0,0 +1,5 @@ +Qt Charts 2.1.3 + +Fixed issues +------------ +- Fix crash on PieChartItem deletion diff --git a/dist/changes-5.9.2 b/dist/changes-5.9.2 new file mode 100644 index 00000000..65c570a3 --- /dev/null +++ b/dist/changes-5.9.2 @@ -0,0 +1,25 @@ +Qt 5.9.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.2 Changes * +**************************************************************************** +- [QTBUG-62137] BarSeries: Account for labels when hovering over the bar +- [QTBUG-56097] Account for very small numbers when setting the axis range +- [QTBUG-63123] Fix crash when SeriesAnimations and point labels visible diff --git a/src/charts/axis/valueaxis/qvalueaxis.cpp b/src/charts/axis/valueaxis/qvalueaxis.cpp index e8f9698f..42dd8ed9 100644 --- a/src/charts/axis/valueaxis/qvalueaxis.cpp +++ b/src/charts/axis/valueaxis/qvalueaxis.cpp @@ -408,25 +408,13 @@ void QValueAxisPrivate::setRange(qreal min, qreal max) return; } - bool changeMin = false; - if (m_min == 0 || min == 0) - changeMin = !qFuzzyCompare(1 + m_min, 1 + min); - else - changeMin = !qFuzzyCompare(m_min, min); - - bool changeMax = false; - if (m_max == 0 || max == 0) - changeMax = !qFuzzyCompare(1 + m_max, 1 + max); - else - changeMax = !qFuzzyCompare(m_max, max); - - if (changeMin) { + if (m_min != min) { m_min = min; changed = true; emit q->minChanged(min); } - if (changeMax) { + if (m_max != max) { m_max = max; changed = true; emit q->maxChanged(max); diff --git a/src/charts/xychart/qxyseries.cpp b/src/charts/xychart/qxyseries.cpp index 40382d15..c85d5340 100644 --- a/src/charts/xychart/qxyseries.cpp +++ b/src/charts/xychart/qxyseries.cpp @@ -1001,6 +1001,9 @@ void QXYSeriesPrivate::initializeAnimations(QtCharts::QChart::AnimationOptions o void QXYSeriesPrivate::drawSeriesPointLabels(QPainter *painter, const QVector<QPointF> &points, const int offset) { + if (points.size() == 0) + return; + static const QString xPointTag(QLatin1String("@xPoint")); static const QString yPointTag(QLatin1String("@yPoint")); const int labelOffset = offset + 2; @@ -1010,7 +1013,8 @@ void QXYSeriesPrivate::drawSeriesPointLabels(QPainter *painter, const QVector<QP QFontMetrics fm(painter->font()); // m_points is used for the label here as it has the series point information // points variable passed is used for positioning because it has the coordinates - for (int i(0); i < m_points.size(); i++) { + const int pointCount = qMin(points.size(), m_points.size()); + for (int i(0); i < pointCount; i++) { QString pointLabel = m_pointLabelsFormat; pointLabel.replace(xPointTag, presenter()->numberToString(m_points.at(i).x())); pointLabel.replace(yPointTag, presenter()->numberToString(m_points.at(i).y())); diff --git a/src/chartsqml2/declarativeopenglrendernode.cpp b/src/chartsqml2/declarativeopenglrendernode.cpp index a0b4ec7f..742a9301 100644 --- a/src/chartsqml2/declarativeopenglrendernode.cpp +++ b/src/chartsqml2/declarativeopenglrendernode.cpp @@ -88,6 +88,26 @@ DeclarativeOpenGLRenderNode::~DeclarativeOpenGLRenderNode() qDeleteAll(m_mouseEvents); } +static const char *vertexSourceCore = + "#version 150\n" + "in vec2 points;\n" + "uniform vec2 min;\n" + "uniform vec2 delta;\n" + "uniform float pointSize;\n" + "uniform mat4 matrix;\n" + "void main() {\n" + " vec2 normalPoint = vec2(-1, -1) + ((points - min) / delta);\n" + " gl_Position = matrix * vec4(normalPoint, 0, 1);\n" + " gl_PointSize = pointSize;\n" + "}"; +static const char *fragmentSourceCore = + "#version 150\n" + "uniform vec3 color;\n" + "out vec4 fragColor;\n" + "void main() {\n" + " fragColor = vec4(color,1);\n" + "}\n"; + static const char *vertexSource = "attribute highp vec2 points;\n" "uniform highp vec2 min;\n" @@ -111,8 +131,13 @@ void DeclarativeOpenGLRenderNode::initGL() recreateFBO(); m_program = new QOpenGLShaderProgram; - m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource); - m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentSource); + if (QOpenGLContext::currentContext()->format().profile() == QSurfaceFormat::CoreProfile) { + m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexSourceCore); + m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentSourceCore); + } else { + m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource); + m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentSource); + } m_program->bindAttributeLocation("points", 0); m_program->link(); diff --git a/tests/auto/qchart/tst_qchart.cpp b/tests/auto/qchart/tst_qchart.cpp index 3e835792..7347f16b 100644 --- a/tests/auto/qchart/tst_qchart.cpp +++ b/tests/auto/qchart/tst_qchart.cpp @@ -40,6 +40,7 @@ #include <QtCharts/QStackedBarSeries> #include <QtCharts/QValueAxis> #include <QtCharts/QBarCategoryAxis> +#include <QtCharts/QDateTimeAxis> #include "tst_definitions.h" QT_CHARTS_USE_NAMESPACE @@ -122,6 +123,8 @@ private slots: void createDefaultAxesForLineSeries(); void axisPolarOrientation(); void backgroundRoundness(); + void zoomInAndOut_data(); + void zoomInAndOut(); private: void createTestData(); @@ -1088,6 +1091,115 @@ void tst_QChart::backgroundRoundness() QVERIFY(m_chart->backgroundRoundness() == 100.0); } +void tst_QChart::zoomInAndOut_data() +{ + const qreal hourInMSecs = 60.0 * 60.0 * 1000.0; + + QTest::addColumn<QString>("axisXType"); + QTest::addColumn<QString>("axisYType"); + QTest::addColumn<qreal>("minX"); + QTest::addColumn<qreal>("maxX"); + QTest::addColumn<qreal>("minY"); + QTest::addColumn<qreal>("maxY"); + + QTest::newRow("value-value-normal") << "QValueAxis" << "QValueAxis" << 0.0 << 100.0 << 0.0 << 100.0; + QTest::newRow("value-value-small") << "QValueAxis" << "QValueAxis" << -1e-12 << 1e-13 << -1e-12 << 1e-13; + QTest::newRow("value-value-mixed") << "QValueAxis" << "QValueAxis" << 0.0 << 100.0 << -1e-12 << 1e-13; + + QTest::newRow("datetime-datetime-normal") << "QDateTimeAxis" << "QDateTimeAxis" + << 0.0 << hourInMSecs << 0.0 << hourInMSecs; + QTest::newRow("datetime-datetime-small") << "QDateTimeAxis" << "QDateTimeAxis" + << 0.0 << 60.0 << 0.0 << 60.0; + QTest::newRow("datetime-datetime-mixed") << "QDateTimeAxis" << "QDateTimeAxis" + << 0.0 << hourInMSecs << 0.0 << 60.0; +} + +#define CHECK_AXIS_RANGES_MATCH \ + if (valueAxisX) { \ + QVERIFY(valueAxisX->min() == minX); \ + QVERIFY(valueAxisX->max() == maxX); \ + } else if (dateTimeAxisX) { \ + QVERIFY(dateTimeAxisX->min().toMSecsSinceEpoch() == minX); \ + QVERIFY(dateTimeAxisX->max().toMSecsSinceEpoch() == maxX); \ + } \ + if (valueAxisY) { \ + QVERIFY(valueAxisY->min() == minY); \ + QVERIFY(valueAxisY->max() == maxY); \ + } else if (dateTimeAxisY) { \ + QVERIFY(dateTimeAxisY->min().toMSecsSinceEpoch() == minY); \ + QVERIFY(dateTimeAxisY->max().toMSecsSinceEpoch() == maxY); \ + } + +void tst_QChart::zoomInAndOut() +{ + QFETCH(QString, axisXType); + QFETCH(QString, axisYType); + QFETCH(qreal, minX); + QFETCH(qreal, maxX); + QFETCH(qreal, minY); + QFETCH(qreal, maxY); + + createTestData(); + QAbstractAxis *axisX = 0; + QAbstractAxis *axisY = 0; + QValueAxis *valueAxisX = 0; + QValueAxis *valueAxisY = 0; + QDateTimeAxis *dateTimeAxisX = 0; + QDateTimeAxis *dateTimeAxisY = 0; + + if (axisXType == "QValueAxis") { + axisX = valueAxisX = new QValueAxis(m_chart); + valueAxisX->setRange(minX, maxX); + } else if (axisXType == "QDateTimeAxis") { + axisX = dateTimeAxisX = new QDateTimeAxis(m_chart); + dateTimeAxisX->setRange(QDateTime::fromMSecsSinceEpoch(minX), QDateTime::fromMSecsSinceEpoch(maxX)); + } + if (axisXType == "QValueAxis") { + axisY = valueAxisY = new QValueAxis(m_chart); + valueAxisY->setRange(minY, maxY); + } else if (axisXType == "QDateTimeAxis") { + axisY = dateTimeAxisY = new QDateTimeAxis(m_chart); + dateTimeAxisY->setRange(QDateTime::fromMSecsSinceEpoch(minY), QDateTime::fromMSecsSinceEpoch(maxY)); + } + + m_chart->setAxisX(axisX, m_chart->series().first()); + m_chart->setAxisY(axisY, m_chart->series().first()); + CHECK_AXIS_RANGES_MATCH + + m_chart->zoomIn(); + if (valueAxisX) { + QVERIFY(valueAxisX->min() != minX); + QVERIFY(valueAxisX->max() != maxX); + } else if (dateTimeAxisX) { + QVERIFY(dateTimeAxisX->min().toMSecsSinceEpoch() != minX); + QVERIFY(dateTimeAxisX->max().toMSecsSinceEpoch() != maxX); + } + if (valueAxisY) { + QVERIFY(valueAxisY->min() != minY); + QVERIFY(valueAxisY->max() != maxY); + } else if (dateTimeAxisY) { + QVERIFY(dateTimeAxisY->min().toMSecsSinceEpoch() != minY); + QVERIFY(dateTimeAxisY->max().toMSecsSinceEpoch() != maxY); + } + + m_chart->zoomReset(); + CHECK_AXIS_RANGES_MATCH + + m_chart->zoomIn(); + m_chart->zoomIn(); + m_chart->zoomReset(); + CHECK_AXIS_RANGES_MATCH + + m_chart->zoomOut(); + m_chart->zoomReset(); + CHECK_AXIS_RANGES_MATCH + + m_chart->zoomOut(); + m_chart->zoomOut(); + m_chart->zoomReset(); + CHECK_AXIS_RANGES_MATCH +} + 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 d5d69a5b..4de89cb1 100644 --- a/tests/auto/qvalueaxis/tst_qvalueaxis.cpp +++ b/tests/auto/qvalueaxis/tst_qvalueaxis.cpp @@ -285,6 +285,7 @@ void tst_QValueAxis::range_raw_data() QTest::newRow("1.0 - 101.0") << (qreal)-1.0 << (qreal)101.0; QTest::newRow("25.0 - 75.0") << (qreal)25.0 << (qreal)75.0; QTest::newRow("101.0") << (qreal)40.0 << (qreal)60.0; + QTest::newRow("smallNumbers") << (qreal)-1e-12 << (qreal)1e-13; } void tst_QValueAxis::range_raw() diff --git a/tests/manual/chartwidgettest/mainwidget.cpp b/tests/manual/chartwidgettest/mainwidget.cpp index 3ff15810..ebb00f22 100644 --- a/tests/manual/chartwidgettest/mainwidget.cpp +++ b/tests/manual/chartwidgettest/mainwidget.cpp @@ -48,13 +48,14 @@ #include <QtWidgets/QLabel> #include <QtWidgets/QSpacerItem> #include <QtWidgets/QMessageBox> -#include <qmath.h> #include <QtCore/QDebug> #include <QtCore/QRandomGenerator> #include <QtGui/QStandardItemModel> #include <QtCharts/QBarCategoryAxis> #include <QtWidgets/QOpenGLWidget> +#include <qmath.h> + QT_CHARTS_USE_NAMESPACE MainWidget::MainWidget(QWidget *parent) : |