From 39f157c2f7d6540f2bc19fa9d232a14e3496e7ab Mon Sep 17 00:00:00 2001 From: Artem Sidyakin <artem.sidyakin@qt.io> Date: Mon, 24 Sep 2018 18:53:42 +0200 Subject: [PATCH] Bunch of stuff - [new demo] iOS sensors - joined cpp-backend-qml demos in one folder - updated imports in di demo - feng-shui --- README.md | 16 +++- .../backend/backend.cpp | 0 .../backend/backend.h | 0 .../backend/backend.pro | 0 .../backend/backend_global.h | 0 .../cpp-backend-qml-library}/backend.h | 0 .../cpp-backend-qml-library}/backend_global.h | 0 .../cpp-backend-qml-library.pro} | 0 .../cpp-backend-qml-library}/main.cpp | 0 .../cpp-backend-qml-library}/main.qml | 0 .../cpp-backend-qml-library}/qml.qrc | 0 .../cpp-backend-qml-ui/Page1Form.ui.qml | 27 ++++++ .../cpp-backend-qml-ui/Page2Form.ui.qml | 20 ++++ .../cpp-backend-qml-ui/ckhdbinterface.cpp | 11 +++ .../cpp-backend-qml-ui/ckhdbinterface.h | 19 ++++ .../cpp-backend-qml-ui/cpp-backend-qml-ui.pro | 33 +++++++ .../cpp-backend-qml-ui/main.cpp | 17 ++++ .../cpp-backend-qml-ui/main.qml | 42 ++++++++ .../cpp-backend-qml-ui/qml.qrc | 8 ++ .../cpp-backend-qml-ui/qtquickcontrols2.conf | 6 ++ demos/di/di/TitilliumButton.qml | 5 +- demos/di/di/TitilliumEdit.qml | 3 +- demos/di/di/TitilliumText.qml | 3 +- demos/di/di/main.qml | 9 +- demos/di/di/pages/pageNet.qml | 7 +- demos/di/di/pages/pageOS.qml | 7 +- demos/di/di/pages/pageScreen.qml | 7 +- demos/di/di/pages/pageStartup.qml | 5 +- demos/di/di/pages/pageSys.qml | 5 +- demos/di/di/pages/pageTest.qml | 5 +- demos/di/di/styles.qml | 4 +- demos/ios-sensors/ios-sensors/ios-sensors.pro | 29 ++++++ demos/ios-sensors/ios-sensors/main.cpp | 15 +++ demos/ios-sensors/ios-sensors/main.qml | 90 ++++++++++++++++++ demos/ios-sensors/ios-sensors/qml.qrc | 5 + .../webengine-recipes/main.cpp | 50 ---------- .../resources/pages/burger.html | 76 --------------- img/ios-sensors.png | Bin 0 -> 62013 bytes 38 files changed, 362 insertions(+), 162 deletions(-) rename demos/{cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library}/backend/backend.cpp (100%) rename demos/{cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library}/backend/backend.h (100%) rename demos/{cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library}/backend/backend.pro (100%) rename demos/{cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library}/backend/backend_global.h (100%) rename demos/{cpp-library-backend-qml/cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library}/backend.h (100%) rename demos/{cpp-library-backend-qml/cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library}/backend_global.h (100%) rename demos/{cpp-library-backend-qml/cpp-library-backend-qml/cpp-library-backend-qml.pro => cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/cpp-backend-qml-library.pro} (100%) rename demos/{cpp-library-backend-qml/cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library}/main.cpp (100%) rename demos/{cpp-library-backend-qml/cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library}/main.qml (100%) rename demos/{cpp-library-backend-qml/cpp-library-backend-qml => cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library}/qml.qrc (100%) create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/Page1Form.ui.qml create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/Page2Form.ui.qml create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/ckhdbinterface.cpp create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/ckhdbinterface.h create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/cpp-backend-qml-ui.pro create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/main.cpp create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/main.qml create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/qml.qrc create mode 100644 demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/qtquickcontrols2.conf create mode 100644 demos/ios-sensors/ios-sensors/ios-sensors.pro create mode 100644 demos/ios-sensors/ios-sensors/main.cpp create mode 100644 demos/ios-sensors/ios-sensors/main.qml create mode 100644 demos/ios-sensors/ios-sensors/qml.qrc delete mode 100644 demos/webengine-recipes/webengine-recipes/resources/pages/burger.html create mode 100755 img/ios-sensors.png diff --git a/README.md b/README.md index 4a3337a..fdb4249 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ A set of rather simple projects that demonstrate various Qt features. - [GUI approaches](#gui-approaches) - [Profiling](#profiling) - [Webengine Recipes](#webengine-recipes) -- [C++ library as a backend for QML](#c-library-as-a-backend-for-qml) +- [C++ as a backend for QML](#c-as-a-backend-for-qml) +- [iOS sensors](#ios-sensors) ## Open Source API @@ -44,9 +45,12 @@ A bit modified standard WebEngine example. <img src="/img/webengine-recipes.png" width="800"> -## C++ library as a backend for QML +## C++ as a backend for QML -How to add an external C++/Qt library into the project and use it as a backend for QML-based frontend. +How to add an external C++/Qt library into the project and use it as a backend for QML-based frontend: + +* variation with C++ library; +* variation with QML UI form. <img src="/img/cpp-library-as-a-backend-for-qml.png" width="800"> @@ -55,3 +59,9 @@ How to add an external C++/Qt library into the project and use it as a backend f Anchoring and reparenting demo. <img src="/img/anchoring.png" width="800"> + +## iOS sensors + +Qt Sensors API on iOS with orientation sensor as an example. + +<img src="/img/ios-sensors.png" width="800"> diff --git a/demos/cpp-library-backend-qml/backend/backend.cpp b/demos/cpp-backend-qml/cpp-backend-qml-library/backend/backend.cpp similarity index 100% rename from demos/cpp-library-backend-qml/backend/backend.cpp rename to demos/cpp-backend-qml/cpp-backend-qml-library/backend/backend.cpp diff --git a/demos/cpp-library-backend-qml/backend/backend.h b/demos/cpp-backend-qml/cpp-backend-qml-library/backend/backend.h similarity index 100% rename from demos/cpp-library-backend-qml/backend/backend.h rename to demos/cpp-backend-qml/cpp-backend-qml-library/backend/backend.h diff --git a/demos/cpp-library-backend-qml/backend/backend.pro b/demos/cpp-backend-qml/cpp-backend-qml-library/backend/backend.pro similarity index 100% rename from demos/cpp-library-backend-qml/backend/backend.pro rename to demos/cpp-backend-qml/cpp-backend-qml-library/backend/backend.pro diff --git a/demos/cpp-library-backend-qml/backend/backend_global.h b/demos/cpp-backend-qml/cpp-backend-qml-library/backend/backend_global.h similarity index 100% rename from demos/cpp-library-backend-qml/backend/backend_global.h rename to demos/cpp-backend-qml/cpp-backend-qml-library/backend/backend_global.h diff --git a/demos/cpp-library-backend-qml/cpp-library-backend-qml/backend.h b/demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/backend.h similarity index 100% rename from demos/cpp-library-backend-qml/cpp-library-backend-qml/backend.h rename to demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/backend.h diff --git a/demos/cpp-library-backend-qml/cpp-library-backend-qml/backend_global.h b/demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/backend_global.h similarity index 100% rename from demos/cpp-library-backend-qml/cpp-library-backend-qml/backend_global.h rename to demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/backend_global.h diff --git a/demos/cpp-library-backend-qml/cpp-library-backend-qml/cpp-library-backend-qml.pro b/demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/cpp-backend-qml-library.pro similarity index 100% rename from demos/cpp-library-backend-qml/cpp-library-backend-qml/cpp-library-backend-qml.pro rename to demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/cpp-backend-qml-library.pro diff --git a/demos/cpp-library-backend-qml/cpp-library-backend-qml/main.cpp b/demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/main.cpp similarity index 100% rename from demos/cpp-library-backend-qml/cpp-library-backend-qml/main.cpp rename to demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/main.cpp diff --git a/demos/cpp-library-backend-qml/cpp-library-backend-qml/main.qml b/demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/main.qml similarity index 100% rename from demos/cpp-library-backend-qml/cpp-library-backend-qml/main.qml rename to demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/main.qml diff --git a/demos/cpp-library-backend-qml/cpp-library-backend-qml/qml.qrc b/demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/qml.qrc similarity index 100% rename from demos/cpp-library-backend-qml/cpp-library-backend-qml/qml.qrc rename to demos/cpp-backend-qml/cpp-backend-qml-library/cpp-backend-qml-library/qml.qrc diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/Page1Form.ui.qml b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/Page1Form.ui.qml new file mode 100644 index 0000000..7b06fc3 --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/Page1Form.ui.qml @@ -0,0 +1,27 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +Page { + width: 600 + height: 400 + property alias btn_callBackend: btn_callBackend + + header: Label { + text: qsTr("Page 1") + font.pixelSize: Qt.application.font.pixelSize * 2 + padding: 10 + } + + Label { + id: lbl + text: qsTr("You are on Page 1.") + anchors.centerIn: parent + } + Button { + id: btn_callBackend + anchors.top: lbl.bottom + anchors.topMargin: 15 + anchors.horizontalCenter: parent.horizontalCenter + text: "Call backend" + } +} diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/Page2Form.ui.qml b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/Page2Form.ui.qml new file mode 100644 index 0000000..5c6f594 --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/Page2Form.ui.qml @@ -0,0 +1,20 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +Page { + width: 600 + height: 400 + + header: Label { + text: qsTr("Page 2") + font.pixelSize: Qt.application.font.pixelSize * 2 + padding: 10 + } + + Label { + text: qsTr("You are on Page 2.<br/>Nothing happens here") + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.centerIn: parent + } +} diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/ckhdbinterface.cpp b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/ckhdbinterface.cpp new file mode 100644 index 0000000..01a926a --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/ckhdbinterface.cpp @@ -0,0 +1,11 @@ +#include "ckhdbinterface.h" + +CKHDBInterface::CKHDBInterface(QObject *parent) : QObject(parent) +{ + +} + +QString CKHDBInterface::setDBValue() +{ + return "something from backend"; +} diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/ckhdbinterface.h b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/ckhdbinterface.h new file mode 100644 index 0000000..4528eb5 --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/ckhdbinterface.h @@ -0,0 +1,19 @@ +#ifndef CKHDBINTERFACE_H +#define CKHDBINTERFACE_H + +#include <QObject> + +class CKHDBInterface : public QObject +{ + Q_OBJECT + +public: + explicit CKHDBInterface(QObject *parent = nullptr); + +public slots: + QString setDBValue(); + +public slots: +}; + +#endif // CKHDBINTERFACE_H diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/cpp-backend-qml-ui.pro b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/cpp-backend-qml-ui.pro new file mode 100644 index 0000000..0c1cf88 --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/cpp-backend-qml-ui.pro @@ -0,0 +1,33 @@ +QT += quick +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + ckhdbinterface.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +HEADERS += \ + ckhdbinterface.h diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/main.cpp b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/main.cpp new file mode 100644 index 0000000..b0c3a8d --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/main.cpp @@ -0,0 +1,17 @@ +#include <QGuiApplication> +#include <QQmlApplicationEngine> +#include "ckhdbinterface.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + qmlRegisterType<CKHDBInterface>("kh.CKHDBInterface", 1, 0, "CKHDBInterface"); + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()) { return -1; } + + return app.exec(); +} diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/main.qml b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/main.qml new file mode 100644 index 0000000..f7027e0 --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/main.qml @@ -0,0 +1,42 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import kh.CKHDBInterface 1.0 + +ApplicationWindow { + visible: true + width: 900 + height: 600 + title: qsTr("C++ backend for QML UI") + + CKHDBInterface { + id: dbIF + } + + SwipeView { + id: swipeView + anchors.fill: parent + currentIndex: tabBar.currentIndex + + Page1Form { + btn_callBackend { + onClicked: { + console.log(dbIF.setDBValue()); + } + } + } + + Page2Form { } + } + + footer: TabBar { + id: tabBar + currentIndex: swipeView.currentIndex + + TabButton { + text: qsTr("Page 1") + } + TabButton { + text: qsTr("Page 2") + } + } +} diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/qml.qrc b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/qml.qrc new file mode 100644 index 0000000..d4df9e8 --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/qml.qrc @@ -0,0 +1,8 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + <file>Page1Form.ui.qml</file> + <file>Page2Form.ui.qml</file> + <file>qtquickcontrols2.conf</file> + </qresource> +</RCC> diff --git a/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/qtquickcontrols2.conf b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/qtquickcontrols2.conf new file mode 100644 index 0000000..75b2cb8 --- /dev/null +++ b/demos/cpp-backend-qml/cpp-backend-qml-ui/cpp-backend-qml-ui/qtquickcontrols2.conf @@ -0,0 +1,6 @@ +; This file can be edited to change the style of the application +; Read "Qt Quick Controls 2 Configuration File" for details: +; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html + +[Controls] +Style=Default diff --git a/demos/di/di/TitilliumButton.qml b/demos/di/di/TitilliumButton.qml index 114381e..310ac99 100755 --- a/demos/di/di/TitilliumButton.qml +++ b/demos/di/di/TitilliumButton.qml @@ -1,6 +1,5 @@ -import QtQuick 2.6 -import QtQuick.Controls 2.0 -import QtQuick.Window 2.0 +import QtQuick 2.11 +import QtQuick.Controls 2.4 import "." // you have to have that for singleton Button { diff --git a/demos/di/di/TitilliumEdit.qml b/demos/di/di/TitilliumEdit.qml index 358e5ee..7631042 100755 --- a/demos/di/di/TitilliumEdit.qml +++ b/demos/di/di/TitilliumEdit.qml @@ -1,5 +1,4 @@ -import QtQuick 2.0 -import QtQuick.Window 2.0 +import QtQuick 2.11 import "." // you have to have that for singleton Rectangle { diff --git a/demos/di/di/TitilliumText.qml b/demos/di/di/TitilliumText.qml index 430ad93..5aebc75 100755 --- a/demos/di/di/TitilliumText.qml +++ b/demos/di/di/TitilliumText.qml @@ -1,5 +1,4 @@ -import QtQuick 2.0 -import QtQuick.Window 2.0 +import QtQuick 2.11 import "." // you have to have that for singleton Text { diff --git a/demos/di/di/main.qml b/demos/di/di/main.qml index 6e25e5d..de4d6c3 100755 --- a/demos/di/di/main.qml +++ b/demos/di/di/main.qml @@ -1,10 +1,5 @@ -import QtQuick 2.7 -import QtQuick.Controls 1.4 -import QtQuick.Controls 2.0 -import QtQuick.Controls.Styles 1.4 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.0 -//import B2Qt.Wifi 1.0 +import QtQuick 2.11 +import QtQuick.Controls 2.4 import io.qt.Backend 1.0 import "." // you have to have that for singleton diff --git a/demos/di/di/pages/pageNet.qml b/demos/di/di/pages/pageNet.qml index 126585b..a6383a0 100755 --- a/demos/di/di/pages/pageNet.qml +++ b/demos/di/di/pages/pageNet.qml @@ -1,7 +1,6 @@ -import QtQuick 2.7 -import QtQuick.Controls 1.4 -import QtQuick.Layouts 1.2 -import QtQuick.Window 2.0 +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.11 import "../" // jeez Flickable { diff --git a/demos/di/di/pages/pageOS.qml b/demos/di/di/pages/pageOS.qml index 18d2a5b..df083f2 100755 --- a/demos/di/di/pages/pageOS.qml +++ b/demos/di/di/pages/pageOS.qml @@ -1,7 +1,6 @@ -import QtQuick 2.7 -import QtQuick.Controls 1.4 -import QtQuick.Layouts 1.2 -import QtQuick.Window 2.0 +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.11 import "../" // jeez GridLayout { diff --git a/demos/di/di/pages/pageScreen.qml b/demos/di/di/pages/pageScreen.qml index dc34ad3..bfb2ffe 100755 --- a/demos/di/di/pages/pageScreen.qml +++ b/demos/di/di/pages/pageScreen.qml @@ -1,6 +1,7 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.2 -import QtQuick.Window 2.0 +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.11 +import QtQuick.Window 2.11 import "../" // jeez GridLayout { diff --git a/demos/di/di/pages/pageStartup.qml b/demos/di/di/pages/pageStartup.qml index 9fc48eb..342700a 100755 --- a/demos/di/di/pages/pageStartup.qml +++ b/demos/di/di/pages/pageStartup.qml @@ -1,5 +1,6 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.2 +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.11 import "../" // jeez GridLayout { diff --git a/demos/di/di/pages/pageSys.qml b/demos/di/di/pages/pageSys.qml index f91e291..55096ae 100755 --- a/demos/di/di/pages/pageSys.qml +++ b/demos/di/di/pages/pageSys.qml @@ -1,5 +1,6 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.2 +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.11 import "../" // jeez ColumnLayout { diff --git a/demos/di/di/pages/pageTest.qml b/demos/di/di/pages/pageTest.qml index cd5fc11..1421362 100755 --- a/demos/di/di/pages/pageTest.qml +++ b/demos/di/di/pages/pageTest.qml @@ -1,5 +1,6 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.3 +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.11 import "../" // jeez Flickable { diff --git a/demos/di/di/styles.qml b/demos/di/di/styles.qml index 021352f..d8ea9f3 100755 --- a/demos/di/di/styles.qml +++ b/demos/di/di/styles.qml @@ -1,6 +1,6 @@ pragma Singleton -import QtQuick 2.7 -import QtQuick.Window 2.0 +import QtQuick 2.11 +import QtQuick.Window 2.11 Item { // primary font size for texts and tabs diff --git a/demos/ios-sensors/ios-sensors/ios-sensors.pro b/demos/ios-sensors/ios-sensors/ios-sensors.pro new file mode 100644 index 0000000..f3be22f --- /dev/null +++ b/demos/ios-sensors/ios-sensors/ios-sensors.pro @@ -0,0 +1,29 @@ +QT += quick sensors +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/demos/ios-sensors/ios-sensors/main.cpp b/demos/ios-sensors/ios-sensors/main.cpp new file mode 100644 index 0000000..eab2f83 --- /dev/null +++ b/demos/ios-sensors/ios-sensors/main.cpp @@ -0,0 +1,15 @@ +#include <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()) { return -1; } + + return app.exec(); +} diff --git a/demos/ios-sensors/ios-sensors/main.qml b/demos/ios-sensors/ios-sensors/main.qml new file mode 100644 index 0000000..7b00552 --- /dev/null +++ b/demos/ios-sensors/ios-sensors/main.qml @@ -0,0 +1,90 @@ +import QtQuick 2.11 +import QtQuick.Window 2.11 +import QtQuick.Controls 2.4 +import QtSensors 5.11 + +Window { + id: root + visible: true + width: 900 + height: 500 + title: qsTr("Sensors on iOS") + + property int currentOrientationVal: 0 + + Rectangle { + id: bckgrnd + anchors.fill: parent + color: "DimGray" + + Text { + anchors.centerIn: parent + text: currentOrientationVal + color: "white" + font.pixelSize: parent.width > parent.height ? parent.width / 5 : parent.height / 5 + font.bold: true + } + + MouseArea { + anchors.fill: parent + onClicked: { + /* // testing AmbientLightSensor, not related to this example + console.log("trying to start - ", sensor_light.start()); + console.log("is busy:", sensor_light.busy); + console.log("error:", sensor_light.error); + console.log("is connected:", sensor_light.connectedToBackend); + console.log("light: ", sensor_light.reading); + console.log("light: ", sensor_light.reading.lightLevel); + */ + + console.log("orientation: ", sensor_orientation.reading.orientation); + } + } + } + +// AmbientLightSensor { +// id: sensor_light +// active: true +// onReadingChanged: { +// console.log("light: " + reading.lightLevel); +// } +// } + +// Gyroscope { +// id: sensor_gyroscope +// //active: true +// onReadingChanged: { +// console.log("gyroscope" + reading.x); +// } +// } + + OrientationSensor { + id: sensor_orientation + active: true + onReadingChanged: { + currentOrientationVal = reading.orientation; + bckgrnd.color = getNewColorForBackground(currentOrientationVal); + } + } + + function getNewColorForBackground(orientation) + { + switch (orientation) + { + case 1: + return "BlueViolet"; + case 2: + return "Crimson"; + case 3: + return "green"; + case 4: + return "Sienna"; + case 5: + return "#438D80"; + case 6: + return "Navy"; + default: + return "DimGray"; + } + } +} diff --git a/demos/ios-sensors/ios-sensors/qml.qrc b/demos/ios-sensors/ios-sensors/qml.qrc new file mode 100644 index 0000000..5f6483a --- /dev/null +++ b/demos/ios-sensors/ios-sensors/qml.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> diff --git a/demos/webengine-recipes/webengine-recipes/main.cpp b/demos/webengine-recipes/webengine-recipes/main.cpp index e0315a7..e914ed1 100644 --- a/demos/webengine-recipes/webengine-recipes/main.cpp +++ b/demos/webengine-recipes/webengine-recipes/main.cpp @@ -1,53 +1,3 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> diff --git a/demos/webengine-recipes/webengine-recipes/resources/pages/burger.html b/demos/webengine-recipes/webengine-recipes/resources/pages/burger.html deleted file mode 100644 index 0e5e4da..0000000 --- a/demos/webengine-recipes/webengine-recipes/resources/pages/burger.html +++ /dev/null @@ -1,76 +0,0 @@ -<!doctype html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>Insanity Burger</title> - <link rel="stylesheet" type="text/css" href="assets/3rdparty/markdown.css"> - <link rel="stylesheet" type="text/css" href="assets/custom.css"> -</head> -<body> - <div id="placeholder"></div> - <div id="content"> - -<img src="images/burger.jpg" alt="Insanity Burger" title="Insanity Burger" /> -Insanity burger -=============== - -### Ingredients - -* 800 g minced chuck steak -* olive oil -* 1 large red onion -* 1 splash of white wine vinegar -* 2 large gherkins -* 4 sesame-topped brioche burger buns -* 4-8 rashers of smoked streaky bacon -* 4 teaspoons American mustard -* Tabasco Chipotle sauce -* 4 thin slices of Red Leicester cheese -* 4 teaspoons tomato ketchup - -#### For the burger sauce -* ¼ of an iceberg lettuce -* 2 heaped tablespoons mayonnaise -* 1 heaped tablespoon tomato ketchup -* 1 teaspoon Tabasco Chipotle sauce -* 1 teaspoon Worcestershire sauce -* 1 teaspoon brandy, or bourbon (optional) - -### Instructions -For the best burger, go to your butcher’s and ask them to mince 800g of chuck steak for you. -This cut has a really good balance of fat and flavoursome meat. Divide it into 4 and, with wet -hands, roll each piece into a ball, then press into flat patties roughly 12cm wide and about 2cm -wider than your buns. Place on an oiled plate and chill in the fridge. Next, finely slice the red -onion, then dress in a bowl with the vinegar and a pinch of sea salt. Slice the gherkins and halve -the buns. Finely chop the lettuce and mix with the rest of the burger sauce ingredients in a bowl, -then season to taste. - -I like to only cook 2 burgers at a time to achieve perfection, so get two pans on the go – a large -non-stick pan on a high heat for your burgers and another on a medium heat for the bacon. Pat your -burgers with oil and season them with salt and pepper. Put 2 burgers into the first pan, pressing -down on them with a fish slice, then put half the bacon into the other pan. After 1 minute, flip -the burgers and brush each cooked side with ½ a teaspoon of mustard and a dash of Tabasco. After -another minute, flip onto the mustard side and brush again with another ½ teaspoon of mustard and -a second dash of Tabasco on the other side. Cook for one more minute, by which point you can place -some crispy bacon on top of each burger with a slice of cheese. Add a tiny splash of water to the -pan and place a heatproof bowl over the burgers to melt the cheese – 30 seconds should do it. At the -same time, toast 2 split buns in the bacon fat in the other pan until lightly golden. Repeat with -the remaining two burgers. - -To build each burger, add a quarter of the burger sauce to the bun base, then top with a cheesy -bacon burger, a quarter of the onions and gherkins. Rub the bun top with a teaspoon of ketchup, -then gently press together. As the burger rests, juices will soak into the bun, so serve right -away, which is great, or for an extra filthy experience, wrap each one in greaseproof paper, then -give it a minute to go gorgeous and sloppy. - -**Enjoy!** - - </div><!--End of content--> - - <script src="assets/3rdparty/marked.min.js"></script> - <script src="assets/custom.js"></script> -</body> -</html> - - - diff --git a/img/ios-sensors.png b/img/ios-sensors.png new file mode 100755 index 0000000000000000000000000000000000000000..844aa7f687a539322257420b6499a0e073d9fc85 GIT binary patch literal 62013 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 literal 0 HcmV?d00001 -- GitLab