From a566125b9fcc023237b442e5b9a838d40455c8fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Arve=20S=C3=A6ther?= Date: Fri, 18 Jan 2019 14:39:00 +0100 Subject: Fix axis constraints API and documentation: This should have been done properly for 5.12. Since this API was introduced in 5.12.0, we simply hide the documentation for the old properties and make sure the properties we want to expose are documented: * Document the xAxis and yAxis properties. * Deprecate the {min,max}imum{X,Y} properties, and hide them in the documentation. Fixes: QTBUG-73137 Change-Id: Ic749bcfec63dc4772f193ccae2a2750c20cb63aa Reviewed-by: Shawn Rutledge --- dist/changes-5.12.1 | 3 ++ src/quick/handlers/qquickpinchhandler.cpp | 56 ++++++++++++++++++++----------- src/quick/handlers/qquickpinchhandler_p.h | 22 +++++++----- 3 files changed, 54 insertions(+), 27 deletions(-) diff --git a/dist/changes-5.12.1 b/dist/changes-5.12.1 index 36fbdb6a72..39767ade87 100644 --- a/dist/changes-5.12.1 +++ b/dist/changes-5.12.1 @@ -66,6 +66,9 @@ information about a particular change. - [QTBUG-71955] TapHandler ignores scroll events and native gestures. - [QTBUG-71317] Event Handlers can now be used in Windows and Dialogs. - [QTBUG-71427] Event Handlers now function properly when created dynamically. + - [QTBUG-73137] The PinchHandler {min,max}imum{X,Y} properties that were + unintentionally included in the 5.12.0 release have now been deprecated. + Please use the xAxis and yAxis properties instead. - [QTBUG-72376] In Text with StyledText textFormat, and tags will now be interpreted as strikethrough style. - [QTBUG-59310] Fixed vertical alignment of images in a text document. diff --git a/src/quick/handlers/qquickpinchhandler.cpp b/src/quick/handlers/qquickpinchhandler.cpp index e6442e7258..95ac0985f0 100644 --- a/src/quick/handlers/qquickpinchhandler.cpp +++ b/src/quick/handlers/qquickpinchhandler.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qquickpinchhandler_p.h" +#include #include #include #include @@ -151,57 +152,48 @@ void QQuickPinchHandler::setMaximumRotation(qreal maximumRotation) emit maximumRotationChanged(); } -/*! - \qmlproperty real QtQuick::PinchHandler::minimumX +#if QT_DEPRECATED_SINCE(5, 12) +void QQuickPinchHandler::warnAboutMinMaxDeprecated() const +{ + qmlWarning(this) << "min and max constraints are now part of the xAxis and yAxis properties"; +} - The minimum acceptable x coordinate of the centroid -*/ void QQuickPinchHandler::setMinimumX(qreal minX) { + warnAboutMinMaxDeprecated(); if (m_minimumX == minX) return; m_minimumX = minX; emit minimumXChanged(); } -/*! - \qmlproperty real QtQuick::PinchHandler::maximumX - - The maximum acceptable x coordinate of the centroid -*/ void QQuickPinchHandler::setMaximumX(qreal maxX) { + warnAboutMinMaxDeprecated(); if (m_maximumX == maxX) return; m_maximumX = maxX; emit maximumXChanged(); } -/*! - \qmlproperty real QtQuick::PinchHandler::minimumY - - The minimum acceptable y coordinate of the centroid -*/ void QQuickPinchHandler::setMinimumY(qreal minY) { + warnAboutMinMaxDeprecated(); if (m_minimumY == minY) return; m_minimumY = minY; emit minimumYChanged(); } -/*! - \qmlproperty real QtQuick::PinchHandler::maximumY - - The maximum acceptable y coordinate of the centroid -*/ void QQuickPinchHandler::setMaximumY(qreal maxY) { + warnAboutMinMaxDeprecated(); if (m_maximumY == maxY) return; m_maximumY = maxY; emit maximumYChanged(); } +#endif bool QQuickPinchHandler::wantsPointerEvent(QQuickPointerEvent *event) { @@ -229,6 +221,32 @@ bool QQuickPinchHandler::wantsPointerEvent(QQuickPointerEvent *event) return true; } +/*! + \qmlpropertygroup QtQuick::PinchHandler::xAxis + \qmlproperty real QtQuick::PinchHandler::xAxis.minimum + \qmlproperty real QtQuick::PinchHandler::xAxis.maximum + \qmlproperty bool QtQuick::PinchHandler::xAxis.enabled + + \c xAxis controls the constraints for horizontal translation of the \l target item. + + \c minimum is the minimum acceptable x coordinate of the translation. + \c maximum is the maximum acceptable x coordinate of the translation. + If \c enabled is true, horizontal dragging is allowed. + */ + +/*! + \qmlpropertygroup QtQuick::PinchHandler::yAxis + \qmlproperty real QtQuick::PinchHandler::yAxis.minimum + \qmlproperty real QtQuick::PinchHandler::yAxis.maximum + \qmlproperty bool QtQuick::PinchHandler::yAxis.enabled + + \c yAxis controls the constraints for vertical translation of the \l target item. + + \c minimum is the minimum acceptable y coordinate of the translation. + \c maximum is the maximum acceptable y coordinate of the translation. + If \c enabled is true, vertical dragging is allowed. + */ + /*! \qmlproperty int QtQuick::PinchHandler::minimumTouchPoints diff --git a/src/quick/handlers/qquickpinchhandler_p.h b/src/quick/handlers/qquickpinchhandler_p.h index 8f24d18166..11d895468c 100644 --- a/src/quick/handlers/qquickpinchhandler_p.h +++ b/src/quick/handlers/qquickpinchhandler_p.h @@ -70,10 +70,12 @@ class Q_AUTOTEST_EXPORT QQuickPinchHandler : public QQuickMultiPointHandler Q_PROPERTY(qreal activeScale READ activeScale NOTIFY updated) Q_PROPERTY(qreal rotation READ rotation NOTIFY updated) Q_PROPERTY(QVector2D translation READ translation NOTIFY updated) - Q_PROPERTY(qreal minimumX READ minimumX WRITE setMinimumX NOTIFY minimumXChanged) - Q_PROPERTY(qreal maximumX READ maximumX WRITE setMaximumX NOTIFY maximumXChanged) - Q_PROPERTY(qreal minimumY READ minimumY WRITE setMinimumY NOTIFY minimumYChanged) - Q_PROPERTY(qreal maximumY READ maximumY WRITE setMaximumY NOTIFY maximumYChanged) +#if QT_DEPRECATED_SINCE(5, 12) + Q_PROPERTY(qreal minimumX READ minimumX WRITE setMinimumX NOTIFY minimumXChanged) // ### Qt 6: remove + Q_PROPERTY(qreal maximumX READ maximumX WRITE setMaximumX NOTIFY maximumXChanged) // ### Qt 6: remove + Q_PROPERTY(qreal minimumY READ minimumY WRITE setMinimumY NOTIFY minimumYChanged) // ### Qt 6: remove + Q_PROPERTY(qreal maximumY READ maximumY WRITE setMaximumY NOTIFY maximumYChanged) // ### Qt 6: remove +#endif Q_PROPERTY(QQuickDragAxis * xAxis READ xAxis CONSTANT) Q_PROPERTY(QQuickDragAxis * yAxis READ yAxis CONSTANT) @@ -96,14 +98,18 @@ public: qreal scale() const { return m_accumulatedScale; } qreal activeScale() const { return m_activeScale; } qreal rotation() const { return m_activeRotation; } - qreal minimumX() const { return m_minimumX; } + +#if QT_DEPRECATED_SINCE(5, 12) + void warnAboutMinMaxDeprecated() const; + qreal minimumX() const { warnAboutMinMaxDeprecated(); return m_minimumX; } void setMinimumX(qreal minX); - qreal maximumX() const { return m_maximumX; } + qreal maximumX() const { warnAboutMinMaxDeprecated(); return m_maximumX; } void setMaximumX(qreal maxX); - qreal minimumY() const { return m_minimumY; } + qreal minimumY() const { warnAboutMinMaxDeprecated(); return m_minimumY; } void setMinimumY(qreal minY); - qreal maximumY() const { return m_maximumY; } + qreal maximumY() const { warnAboutMinMaxDeprecated(); return m_maximumY; } void setMaximumY(qreal maxY); +#endif QQuickDragAxis *xAxis() { return &m_xAxis; } QQuickDragAxis *yAxis() { return &m_yAxis; } -- cgit v1.2.3 From d27d896d8cb9d240138fe8ea69f1051f74ce1945 Mon Sep 17 00:00:00 2001 From: Rainer Keller Date: Mon, 21 Jan 2019 10:02:01 +0100 Subject: Improve error message Show more datails about what actually went wrong. Change-Id: I418a4d1f433bd4d440fc34e9a4932a9ea010b174 Reviewed-by: Ulf Hermann --- src/qml/compiler/qqmlpropertyvalidator.cpp | 6 +++++- .../auto/qml/qqmllanguage/data/invalidGroupedProperty.1.errors.txt | 2 +- .../auto/qml/qqmllanguage/data/invalidGroupedProperty.3.errors.txt | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qml/compiler/qqmlpropertyvalidator.cpp b/src/qml/compiler/qqmlpropertyvalidator.cpp index 4cb922ca8d..25dcaa0c2d 100644 --- a/src/qml/compiler/qqmlpropertyvalidator.cpp +++ b/src/qml/compiler/qqmlpropertyvalidator.cpp @@ -276,7 +276,11 @@ QVector QQmlPropertyValidator::validateObject(int objectIndex, } } else { if (!enginePrivate->propertyCacheForType(pd->propType())) { - return recordError(binding->location, tr("Invalid grouped property access")); + return recordError(binding->location, + tr("Invalid grouped property access: Property \"%1\" with type \"%2\", which is not a value type") + .arg(name) + .arg(QString::fromLatin1(QMetaType::typeName(pd->propType()))) + ); } } } diff --git a/tests/auto/qml/qqmllanguage/data/invalidGroupedProperty.1.errors.txt b/tests/auto/qml/qqmllanguage/data/invalidGroupedProperty.1.errors.txt index 810fd31b41..d76f18ba89 100644 --- a/tests/auto/qml/qqmllanguage/data/invalidGroupedProperty.1.errors.txt +++ b/tests/auto/qml/qqmllanguage/data/invalidGroupedProperty.1.errors.txt @@ -1 +1 @@ -5:5:Invalid grouped property access +5:5:Invalid grouped property access: Property "o" with type "QVariant", which is not a value type diff --git a/tests/auto/qml/qqmllanguage/data/invalidGroupedProperty.3.errors.txt b/tests/auto/qml/qqmllanguage/data/invalidGroupedProperty.3.errors.txt index f6d6f29fbf..9a0422753f 100644 --- a/tests/auto/qml/qqmllanguage/data/invalidGroupedProperty.3.errors.txt +++ b/tests/auto/qml/qqmllanguage/data/invalidGroupedProperty.3.errors.txt @@ -1 +1 @@ -4:5:Invalid grouped property access +4:5:Invalid grouped property access: Property "customType" with type "MyCustomVariantType", which is not a value type -- cgit v1.2.3 From 5de48ee56a5afb0045d40851a4a1dd79db82c772 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Mon, 4 Feb 2019 12:02:01 +0100 Subject: QMLJS: Have ScanFunctions iterate over ArrayPattern nodes Like Codegen, have ScanFunctions iterate over the elements in an ArrayPattern, instead of recursing over the tail of the element list. This prevents running out of (native) stack, or hitting the recursion check limiter. Change-Id: I8203af3119ad50f19000a215af42649d9bcb3784 Fixes: QTBUG-73425 Reviewed-by: Lars Knoll --- src/qml/compiler/qv4compilerscanfunctions.cpp | 8 ++++++++ src/qml/compiler/qv4compilerscanfunctions_p.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/qml/compiler/qv4compilerscanfunctions.cpp b/src/qml/compiler/qv4compilerscanfunctions.cpp index fc3ac769ae..e0eaa8867b 100644 --- a/src/qml/compiler/qv4compilerscanfunctions.cpp +++ b/src/qml/compiler/qv4compilerscanfunctions.cpp @@ -481,6 +481,14 @@ bool ScanFunctions::visit(FieldMemberExpression *ast) return true; } +bool ScanFunctions::visit(ArrayPattern *ast) +{ + for (PatternElementList *it = ast->elements; it; it = it->next) + Node::accept(it->element, this); + + return false; +} + bool ScanFunctions::enterFunction(FunctionExpression *ast, bool enterName) { if (_context->isStrict && (ast->name == QLatin1String("eval") || ast->name == QLatin1String("arguments"))) diff --git a/src/qml/compiler/qv4compilerscanfunctions_p.h b/src/qml/compiler/qv4compilerscanfunctions_p.h index 4463a4f4f3..28ad846bcd 100644 --- a/src/qml/compiler/qv4compilerscanfunctions_p.h +++ b/src/qml/compiler/qv4compilerscanfunctions_p.h @@ -120,6 +120,7 @@ protected: bool visit(AST::TemplateLiteral *ast) override; bool visit(AST::SuperLiteral *) override; bool visit(AST::FieldMemberExpression *) override; + bool visit(AST::ArrayPattern *) override; bool enterFunction(AST::FunctionExpression *ast, bool enterName); -- cgit v1.2.3 From 78c1fcbc49f56463064eef738a475d9018357b24 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Fri, 1 Feb 2019 17:29:43 +0100 Subject: QQuickWindow: don't give exclusive grab to invisible or disabled Items MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An Item might set itself invisible or disabled while handling a mouse press, as an alternative to rejecting the event. In earlier Qt versions (e.g. 5.6) it did not end up with a grab in such a case. Task-number: QTBUG-63271 Change-Id: I12f646e4217d773d396f380672420c85e6adcd52 Reviewed-by: Qt CI Bot Reviewed-by: Mitch Curtis Reviewed-by: Jan Arve Sæther --- src/quick/items/qquickwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index dd5960e925..61c8bcc1e7 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -2623,7 +2623,7 @@ void QQuickWindowPrivate::deliverMatchingPointsToItem(QQuickItem *item, QQuickPo auto mouseGrabber = q->mouseGrabberItem(); if (mouseGrabber && mouseGrabber != item && mouseGrabber != oldMouseGrabber) { item->mouseUngrabEvent(); - } else { + } else if (item->isEnabled() && item->isVisible()) { item->grabMouse(); } point->setAccepted(true); -- cgit v1.2.3 From 8ab6ded97633bf7f74e7ca4de35ed56d07f358d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Arve=20S=C3=A6ther?= Date: Mon, 4 Feb 2019 15:16:45 +0100 Subject: Fix bug where QQMPH kept an exclusive grab when no buttons were pressed This happened if you moved the mouse while doing a multitouch operation. More specifically this caused the bug: 1. Open qtdeclarative/tests/manual/pointer/map.qml 2. Rotate the map with two fingers (Do not release fingers). 3. Move mouse (no buttons pressed). 4. Release both fingers. 5. Move mouse again (error: the draghandler has a grab and thus the map is dragged even if no buttons are down). This happened because if you moved the mouse while having two fingers down, Windows would generate a *mouse*move* event with Left button or Right button pressed (which wasn't the case on the physical device but it's probably because of a bug in how mouse events are synthesized from touch on Windows). This caused the QQuickMultiPointHandler to do a passive grab. Then, when releasing the fingers it would not send a mouse release event (just plain touch release events), so the QQuickMultiPointHandler would keep the passive grab it had. All subsequent mouse move events would then be dispatched to the QQuickMultiPointHandler where it would assume that the button was pressed until it got a release event (but button was never pressed so that wouldn't happen). Eventually it would perform an exclusive grab, and dragging was initiated. Change-Id: I42b3133c5fde93c7f92f1cb28705156a69f9ad1c Reviewed-by: Shawn Rutledge --- src/quick/handlers/qquickmultipointhandler.cpp | 4 ++ .../data/draghandler_and_pinchhandler.qml | 61 ++++++++++++++++++++++ .../qquickdraghandler/tst_qquickdraghandler.cpp | 46 ++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 tests/auto/quick/pointerhandlers/qquickdraghandler/data/draghandler_and_pinchhandler.qml diff --git a/src/quick/handlers/qquickmultipointhandler.cpp b/src/quick/handlers/qquickmultipointhandler.cpp index 228c99bb12..baa68e5e53 100644 --- a/src/quick/handlers/qquickmultipointhandler.cpp +++ b/src/quick/handlers/qquickmultipointhandler.cpp @@ -162,6 +162,10 @@ QVector QQuickMultiPointHandler::eligiblePoints(QQuickPointe bool stealingAllowed = event->isPressEvent() || event->isReleaseEvent(); for (int i = 0; i < c; ++i) { QQuickEventPoint *p = event->point(i); + if (QQuickPointerMouseEvent *me = event->asPointerMouseEvent()) { + if (me->buttons() == Qt::NoButton) + continue; + } if (!stealingAllowed) { QObject *exclusiveGrabber = p->exclusiveGrabber(); if (exclusiveGrabber && exclusiveGrabber != this && !canGrab(p)) diff --git a/tests/auto/quick/pointerhandlers/qquickdraghandler/data/draghandler_and_pinchhandler.qml b/tests/auto/quick/pointerhandlers/qquickdraghandler/data/draghandler_and_pinchhandler.qml new file mode 100644 index 0000000000..08b85aef50 --- /dev/null +++ b/tests/auto/quick/pointerhandlers/qquickdraghandler/data/draghandler_and_pinchhandler.qml @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the manual tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.12 + +Item { + id: root + objectName: "DragHandler_and_PinchHandler" + width: 640 + height: 480 + + Rectangle { + id: rect + objectName: "Rect" + color: dragHandler.active ? "blue" : (pinchHandler.active ? "magenta" : "grey") + width: 200; height: 200; x: 100; y: 100 + + PinchHandler { + id: pinchHandler + objectName: "PinchHandler" + } + DragHandler { + id: dragHandler + objectName: "DragHandler" + } + + Text { + color: "white" + anchors.centerIn: parent + horizontalAlignment: Text.AlignHCenter + text: rect.objectName + "\n" + + "rotation:" + rect.rotation + "\n" + + dragHandler.centroid.position.x.toFixed(1) + "," + dragHandler.centroid.position.y.toFixed(1) + } + } +} diff --git a/tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp b/tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp index 0c544ef484..eb210c2112 100644 --- a/tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp +++ b/tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp @@ -60,6 +60,7 @@ private slots: void touchDragMultiSliders(); void touchPassiveGrabbers_data(); void touchPassiveGrabbers(); + void touchPinchAndMouseMove(); private: void createView(QScopedPointer &window, const char *fileName); @@ -521,6 +522,51 @@ void tst_DragHandler::touchPassiveGrabbers() QQuickTouchUtils::flush(window); } +void tst_DragHandler::touchPinchAndMouseMove() +{ + QScopedPointer windowPtr; + createView(windowPtr, "draghandler_and_pinchhandler.qml"); + QQuickView *window = windowPtr.data(); + QQuickItem *rect = window->rootObject()->findChild(QLatin1String("Rect")); + QQuickPointerHandler *pinchHandler = window->rootObject()->findChild(QLatin1String("PinchHandler")); + + QPoint p1(150,200); + QPoint p2(250,200); + + // Trigger a scale pinch, PinchHandler should activate + QTest::QTouchEventSequence touch = QTest::touchEvent(window, touchDevice); + touch.press(1, p1).press(2, p2).commit(); + QQuickTouchUtils::flush(window); + QPoint delta(10,0); + for (int i = 0; i < 10 && !pinchHandler->active(); ++i) { + p1-=delta; + p2+=delta; + touch.move(1, p1).move(2, p2).commit(); + QQuickTouchUtils::flush(window); + } + QCOMPARE(pinchHandler->active(), true); + + // While having the touch points pressed, send wrong mouse event as MS Windows did: + // * A MoveMove with LeftButton down + // (in order to synthesize that, qtestMouseButtons needs to be modified) + // (This will make the DragHandler do a passive grab) + QTestPrivate::qtestMouseButtons = Qt::LeftButton; + QTest::mouseMove(window, p1 + delta); + + touch.release(1, p1).release(2, p2).commit(); + QQuickTouchUtils::flush(window); + + // Now move the mouse with no buttons down and check if the rect did not move + // At this point, no touch points are pressed and no mouse buttons are pressed. + QTestPrivate::qtestMouseButtons = Qt::NoButton; + QSignalSpy rectMovedSpy(rect, SIGNAL(xChanged())); + for (int i = 0; i < 10; ++i) { + p1 += delta; + QTest::mouseMove(window, p1); + QCOMPARE(rectMovedSpy.count(), 0); + } +} + QTEST_MAIN(tst_DragHandler) #include "tst_qquickdraghandler.moc" -- cgit v1.2.3 From 895302829b46e00cde8eef13eb7c630af5d771e2 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 6 Feb 2019 10:43:34 +0100 Subject: Try to stabilize tst_qquickwindow::defaultSurfaceFormat Apparently the OpenGL context is not guaranteed to be available right after showing the window. Wait for it to appear. Change-Id: Ie3acdb857d4e3a8c6c148c57916a49a58c93a835 Reviewed-by: Mitch Curtis --- tests/auto/quick/qquickwindow/tst_qquickwindow.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index ab101dc1be..a862604fc1 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -2350,8 +2350,10 @@ void tst_qquickwindow::defaultSurfaceFormat() // Depth and stencil should be >= what has been requested. For real. But use // the context since the window's surface format is only partially updated // on most platforms. - QVERIFY(window.openglContext()->format().depthBufferSize() >= 16); - QVERIFY(window.openglContext()->format().stencilBufferSize() >= 8); + const QOpenGLContext *openglContext = nullptr; + QTRY_VERIFY((openglContext = window.openglContext()) != nullptr); + QVERIFY(openglContext->format().depthBufferSize() >= 16); + QVERIFY(openglContext->format().stencilBufferSize() >= 8); #endif QSurfaceFormat::setDefaultFormat(savedDefaultFormat); } -- cgit v1.2.3