summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/corelib/CMakeLists.txt1
-rw-r--r--examples/corelib/bindableproperties/CMakeLists.txt2
-rw-r--r--examples/corelib/bindableproperties/bindableproperties.pro4
-rw-r--r--examples/corelib/bindableproperties/bindablesubscription/CMakeLists.txt53
-rw-r--r--examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.cpp98
-rw-r--r--examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.h91
-rw-r--r--examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.pro22
-rw-r--r--examples/corelib/bindableproperties/bindablesubscription/bindableuser.cpp65
-rw-r--r--examples/corelib/bindableproperties/bindablesubscription/bindableuser.h86
-rw-r--r--examples/corelib/bindableproperties/bindablesubscription/main.cpp118
-rw-r--r--examples/corelib/bindableproperties/doc/images/bindable_properties_example.pngbin0 -> 18831 bytes
-rw-r--r--examples/corelib/bindableproperties/doc/src/bindableproperties.qdoc202
-rw-r--r--examples/corelib/bindableproperties/shared/countries.qrc7
-rw-r--r--examples/corelib/bindableproperties/shared/finland.pngbin0 -> 1062 bytes
-rw-r--r--examples/corelib/bindableproperties/shared/germany.pngbin0 -> 483 bytes
-rw-r--r--examples/corelib/bindableproperties/shared/norway.pngbin0 -> 5190 bytes
-rw-r--r--examples/corelib/bindableproperties/shared/subscriptionwindow.cpp63
-rw-r--r--examples/corelib/bindableproperties/shared/subscriptionwindow.h76
-rw-r--r--examples/corelib/bindableproperties/shared/subscriptionwindow.ui280
-rw-r--r--examples/corelib/bindableproperties/subscription/CMakeLists.txt53
-rw-r--r--examples/corelib/bindableproperties/subscription/main.cpp138
-rw-r--r--examples/corelib/bindableproperties/subscription/subscription.cpp126
-rw-r--r--examples/corelib/bindableproperties/subscription/subscription.h95
-rw-r--r--examples/corelib/bindableproperties/subscription/subscription.pro22
-rw-r--r--examples/corelib/bindableproperties/subscription/user.cpp71
-rw-r--r--examples/corelib/bindableproperties/subscription/user.h86
-rw-r--r--examples/gui/rasterwindow/rasterwindow.h3
-rw-r--r--examples/network/multistreamclient/timeconsumer.cpp2
-rw-r--r--examples/network/multistreamserver/timeprovider.cpp2
-rw-r--r--examples/widgets/desktop/systray/doc/src/systray.qdoc8
-rw-r--r--examples/widgets/desktop/systray/window.cpp5
-rw-r--r--examples/widgets/draganddrop/puzzle/puzzlewidget.cpp4
-rw-r--r--examples/widgets/itemviews/puzzle/puzzlewidget.cpp4
-rw-r--r--examples/widgets/painting/affine/xform.cpp93
-rw-r--r--examples/widgets/painting/affine/xform.h16
-rw-r--r--examples/widgets/painting/deform/pathdeform.cpp2
-rw-r--r--examples/widgets/painting/shared/arthurwidgets.cpp30
-rw-r--r--examples/widgets/painting/shared/arthurwidgets.h18
-rw-r--r--examples/widgets/painting/shared/hoverpoints.cpp368
-rw-r--r--examples/widgets/painting/shared/hoverpoints.h28
-rw-r--r--examples/widgets/qnx/foreignwindows/collector.cpp2
-rw-r--r--examples/widgets/qnx/foreignwindows/collector.h2
-rw-r--r--examples/widgets/richtext/textedit/example.html9
-rw-r--r--examples/widgets/tools/echoplugin/echowindow/CMakeLists.txt1
-rw-r--r--examples/widgets/tools/plugandpaint/app/CMakeLists.txt1
-rw-r--r--examples/widgets/tools/styleplugin/stylewindow/CMakeLists.txt1
-rw-r--r--examples/widgets/tools/treemodelcompleter/mainwindow.cpp5
-rw-r--r--examples/widgets/widgets/tetrix/tetrixwindow.cpp9
48 files changed, 2042 insertions, 330 deletions
diff --git a/examples/corelib/CMakeLists.txt b/examples/corelib/CMakeLists.txt
index 08b44649b7..30e2c8cd1f 100644
--- a/examples/corelib/CMakeLists.txt
+++ b/examples/corelib/CMakeLists.txt
@@ -1,5 +1,6 @@
# Generated from corelib.pro.
+add_subdirectory(bindableproperties)
add_subdirectory(ipc)
add_subdirectory(mimetypes)
add_subdirectory(serialization)
diff --git a/examples/corelib/bindableproperties/CMakeLists.txt b/examples/corelib/bindableproperties/CMakeLists.txt
new file mode 100644
index 0000000000..c6d9076fd8
--- /dev/null
+++ b/examples/corelib/bindableproperties/CMakeLists.txt
@@ -0,0 +1,2 @@
+qt_internal_add_example(bindablesubscription)
+qt_internal_add_example(subscription)
diff --git a/examples/corelib/bindableproperties/bindableproperties.pro b/examples/corelib/bindableproperties/bindableproperties.pro
new file mode 100644
index 0000000000..fab8d8107a
--- /dev/null
+++ b/examples/corelib/bindableproperties/bindableproperties.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+SUBDIRS = \
+ bindablesubscription \
+ subscription
diff --git a/examples/corelib/bindableproperties/bindablesubscription/CMakeLists.txt b/examples/corelib/bindableproperties/bindablesubscription/CMakeLists.txt
new file mode 100644
index 0000000000..b2909589a5
--- /dev/null
+++ b/examples/corelib/bindableproperties/bindablesubscription/CMakeLists.txt
@@ -0,0 +1,53 @@
+cmake_minimum_required(VERSION 3.16)
+project(bindablesubscription LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+ set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/corelib/bindableproperties/bindablesubscription")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Widgets)
+
+qt_add_executable(bindablesubscription
+ ../shared/subscriptionwindow.cpp ../shared/subscriptionwindow.h ../shared/subscriptionwindow.ui
+ main.cpp
+ main.cpp
+ bindablesubscription.cpp bindablesubscription.h
+ bindableuser.cpp bindableuser.h
+)
+target_link_libraries(bindablesubscription PUBLIC
+ Qt::Core
+ Qt::Gui
+ Qt::Widgets
+)
+
+# Resources:
+set(countries_resource_files
+ "../shared/finland.png"
+ "../shared/germany.png"
+ "../shared/norway.png"
+)
+
+qt6_add_resources(bindablesubscription "countries"
+ PREFIX
+ "/"
+ BASE
+ "../shared"
+ FILES
+ ${countries_resource_files}
+)
+
+install(TARGETS bindablesubscription
+ RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.cpp b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.cpp
new file mode 100644
index 0000000000..14b28b3fae
--- /dev/null
+++ b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.cpp
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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 "bindablesubscription.h"
+#include "bindableuser.h"
+
+//! [binding-expressions]
+
+BindableSubscription::BindableSubscription(BindableUser *user) : m_user(user)
+{
+ Q_ASSERT(user);
+
+ m_price.setBinding([this] { return qRound(calculateDiscount() * m_duration * basePrice()); });
+
+ m_isValid.setBinding([this] {
+ return m_user->country() != BindableUser::None && m_user->age() > 12;
+ });
+}
+
+//! [binding-expressions]
+
+//! [set-duration]
+
+void BindableSubscription::setDuration(Duration newDuration)
+{
+ m_duration = newDuration;
+}
+
+//! [set-duration]
+
+double BindableSubscription::calculateDiscount() const
+{
+ switch (m_duration) {
+ case Monthly:
+ return 1;
+ case Quarterly:
+ return 0.9;
+ case Yearly:
+ return 0.6;
+ }
+ Q_ASSERT(false);
+ return -1;
+}
+
+int BindableSubscription::basePrice() const
+{
+ if (m_user->country() == BindableUser::None)
+ return 0;
+
+ return (m_user->country() == BindableUser::Norway) ? 100 : 80;
+}
diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.h b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.h
new file mode 100644
index 0000000000..763864d627
--- /dev/null
+++ b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.h
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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$
+**
+****************************************************************************/
+
+#ifndef BINDABLESUBSCRIPTION_H
+#define BINDABLESUBSCRIPTION_H
+
+#include <QPointer>
+#include <QProperty>
+
+class BindableUser;
+
+//! [bindable-subscription-class]
+
+class BindableSubscription
+{
+public:
+ enum Duration { Monthly = 1, Quarterly = 4, Yearly = 12 };
+
+ BindableSubscription(BindableUser *user);
+ BindableSubscription(const BindableSubscription &) = delete;
+
+ int price() const { return m_price; }
+ QBindable<int> bindablePrice() { return &m_price; }
+
+ Duration duration() const { return m_duration; }
+ void setDuration(Duration newDuration);
+ QBindable<Duration> bindableDuration() { return &m_duration; }
+
+ bool isValid() const { return m_isValid; }
+ QBindable<bool> bindableIsValid() { return &m_isValid; }
+
+private:
+ double calculateDiscount() const;
+ int basePrice() const;
+
+ BindableUser *m_user;
+ QProperty<Duration> m_duration { Monthly };
+ QProperty<int> m_price { 0 };
+ QProperty<bool> m_isValid { false };
+};
+
+//! [bindable-subscription-class]
+
+#endif // BNDABLESUBSCRIPTION_H
diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.pro b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.pro
new file mode 100644
index 0000000000..321a1226c4
--- /dev/null
+++ b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.pro
@@ -0,0 +1,22 @@
+QT += widgets
+TARGET = bindablesubscription
+
+SOURCES += main.cpp \
+ bindablesubscription.cpp \
+ bindableuser.cpp \
+ ../shared/subscriptionwindow.cpp
+
+target.path = $$[QT_INSTALL_EXAMPLES]/corelib/bindableproperties/bindablesubscription
+INSTALLS += target
+
+FORMS += \
+ ../shared/subscriptionwindow.ui
+
+HEADERS += \
+ bindablesubscription.h \
+ bindableuser.h \
+ ../shared/subscriptionwindow.h
+
+RESOURCES += \
+ ../shared/countries.qrc
+
diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindableuser.cpp b/examples/corelib/bindableproperties/bindablesubscription/bindableuser.cpp
new file mode 100644
index 0000000000..d30e203b61
--- /dev/null
+++ b/examples/corelib/bindableproperties/bindablesubscription/bindableuser.cpp
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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 "bindableuser.h"
+
+//! [bindable-user-setters]
+
+void BindableUser::setCountry(Country country)
+{
+ m_country = country;
+}
+
+void BindableUser::setAge(int age)
+{
+ m_age = age;
+}
+
+//! [bindable-user-setters]
diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindableuser.h b/examples/corelib/bindableproperties/bindablesubscription/bindableuser.h
new file mode 100644
index 0000000000..65541e6ac1
--- /dev/null
+++ b/examples/corelib/bindableproperties/bindablesubscription/bindableuser.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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$
+**
+****************************************************************************/
+
+#ifndef BINDABLEUSER_H
+#define BINDABLEUSER_H
+
+#include <QProperty>
+
+//! [bindable-user-class]
+
+class BindableUser
+{
+public:
+ enum Country {
+ None,
+ Finland,
+ Germany,
+ Norway,
+ };
+
+ BindableUser() = default;
+ BindableUser(const BindableUser &) = delete;
+
+ Country country() const { return m_country; }
+ void setCountry(Country country);
+ QBindable<Country> bindableCountry() { return &m_country; }
+
+ int age() const { return m_age; }
+ void setAge(int age);
+ QBindable<int> bindableAge() { return &m_age; }
+
+private:
+ QProperty<Country> m_country { None };
+ QProperty<int> m_age { 0 };
+};
+
+//! [bindable-user-class]
+
+#endif // BINDABLEUSER_H
diff --git a/examples/corelib/bindableproperties/bindablesubscription/main.cpp b/examples/corelib/bindableproperties/bindablesubscription/main.cpp
new file mode 100644
index 0000000000..df935679ad
--- /dev/null
+++ b/examples/corelib/bindableproperties/bindablesubscription/main.cpp
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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 "../shared/subscriptionwindow.h"
+#include "bindablesubscription.h"
+#include "bindableuser.h"
+
+#include <QApplication>
+#include <QButtonGroup>
+#include <QLabel>
+#include <QPushButton>
+#include <QRadioButton>
+#include <QSpinBox>
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ BindableUser user;
+ BindableSubscription subscription(&user);
+
+ SubscriptionWindow w;
+
+ // Initialize subscription data
+ QRadioButton *monthly = w.findChild<QRadioButton *>("btnMonthly");
+ QObject::connect(monthly, &QRadioButton::clicked, [&] {
+ subscription.setDuration(BindableSubscription::Monthly);
+ });
+ QRadioButton *quarterly = w.findChild<QRadioButton *>("btnQuarterly");
+ QObject::connect(quarterly, &QRadioButton::clicked, [&] {
+ subscription.setDuration(BindableSubscription::Quarterly);
+ });
+ QRadioButton *yearly = w.findChild<QRadioButton *>("btnYearly");
+ QObject::connect(yearly, &QRadioButton::clicked, [&] {
+ subscription.setDuration(BindableSubscription::Yearly);
+ });
+
+ // Initialize user data
+ QPushButton *germany = w.findChild<QPushButton *>("btnGermany");
+ QObject::connect(germany, &QPushButton::clicked, [&] {
+ user.setCountry(BindableUser::Germany);
+ });
+ QPushButton *finland = w.findChild<QPushButton *>("btnFinland");
+ QObject::connect(finland, &QPushButton::clicked, [&] {
+ user.setCountry(BindableUser::Finland);
+ });
+ QPushButton *norway = w.findChild<QPushButton *>("btnNorway");
+ QObject::connect(norway, &QPushButton::clicked, [&] {
+ user.setCountry(BindableUser::Norway);
+ });
+
+ QSpinBox *ageSpinBox = w.findChild<QSpinBox *>("ageSpinBox");
+ QObject::connect(ageSpinBox, &QSpinBox::valueChanged, [&](int value) {
+ user.setAge(value);
+ });
+
+ QLabel *priceDisplay = w.findChild<QLabel *>("priceDisplay");
+
+ // Track price changes
+//! [update-ui]
+ auto priceChangeHandler = subscription.bindablePrice().subscribe([&] {
+ priceDisplay->setText(QString::number(subscription.price()));
+ });
+
+ auto priceValidHandler = subscription.bindableIsValid().subscribe([&] {
+ priceDisplay->setEnabled(subscription.isValid());
+ });
+//! [update-ui]
+
+ w.show();
+ return a.exec();
+}
diff --git a/examples/corelib/bindableproperties/doc/images/bindable_properties_example.png b/examples/corelib/bindableproperties/doc/images/bindable_properties_example.png
new file mode 100644
index 0000000000..f38261a217
--- /dev/null
+++ b/examples/corelib/bindableproperties/doc/images/bindable_properties_example.png
Binary files differ
diff --git a/examples/corelib/bindableproperties/doc/src/bindableproperties.qdoc b/examples/corelib/bindableproperties/doc/src/bindableproperties.qdoc
new file mode 100644
index 0000000000..8c36921ff8
--- /dev/null
+++ b/examples/corelib/bindableproperties/doc/src/bindableproperties.qdoc
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example bindableproperties
+ \title Bindable Properties Example
+ \brief Demonstrates how the usage of bindable properties can simplify
+ your C++ code.
+
+ In this example we will demonstrate two approaches for expressing the
+ relationships between different objects depending on each other:
+ signal/slot connection-based and bindable property-based. For this
+ purpose we will consider a subscription service model to calculate the
+ cost of the subscription.
+
+ \image bindable_properties_example.png
+
+ \section1 Modelling Subscription System with Signal/Slot Approach
+
+ Let's first consider the usual pre-Qt 6 implementation.
+ To model the subscription service the \c Subscription class is used:
+
+ \snippet bindableproperties/subscription/subscription.h subscription-class
+
+ It stores the information about the subscription and provides corresponding
+ getters, setters, and notifier signals for informing the listeners about the
+ subscription information changes. It also keeps a pointer to an instance of
+ the \c User class.
+
+ The price of the subscription is calculated based on the duration of the
+ subscription:
+
+ \snippet bindableproperties/subscription/subscription.cpp calculate-discount
+
+ And user's location:
+
+ \snippet bindableproperties/subscription/subscription.cpp calculate-base-price
+
+ When the price changes, the \c priceChanged() signal is emitted, to notify the
+ listeners about the change:
+
+ \snippet bindableproperties/subscription/subscription.cpp calculate-price
+
+ Similarly, when the duration of the subscription changes, the \c durationChanged()
+ signal is emitted.
+
+ \snippet bindableproperties/subscription/subscription.cpp set-duration
+
+ \note Both methods need to check if the data is actually changed and
+ only then emit the signals. \c setDuration() also needs to recalculate
+ the price, when the duration has changed.
+
+ The \c Subscription is not valid unless the user has a valid country and
+ age, so the validity is updated in the following way:
+
+ \snippet bindableproperties/subscription/subscription.cpp update-validity
+
+ The \c User class is simple: it stores country and age of the user and
+ provides the corresponding getters, setters, and notifier signals:
+
+ \snippet bindableproperties/subscription/user.h user-class
+
+ \snippet bindableproperties/subscription/user.cpp user-setters
+
+ In the \c main() function we initialize instances of \c User and
+ \c Subsrcription:
+
+ \snippet bindableproperties/subscription/main.cpp init
+
+ And do the proper signal-slot connections, to update the \c user and
+ \c subsrcription data when UI elements change. That is straightforward,
+ so we will skip this part.
+
+ Next, we connect to \c Subscription::priceChanged(), to update the price
+ in the UI when the price changes.
+
+ \snippet bindableproperties/subscription/main.cpp connect-price-changed
+
+ We also connect to \c Subscription::isValidChanged(), to disable the price
+ display if the subscription isn't valid.
+
+ \snippet bindableproperties/subscription/main.cpp connect-validity-changed
+
+ Because the subsrcription price and validity also depend on the user's
+ country and age, we also need to connect to the \c User::countryChanged()
+ and \c User::ageChanged() signals and update \c subscription accordingly.
+
+ \snippet bindableproperties/subscription/main.cpp connect-user
+
+ This works, but there are some problems:
+
+ \list
+ \li There's a lot of boilerplate code for the signal-slot connections,
+ to be able to react to changes to \c user or \c subscription. If any of
+ the dependencies of the price changes, we need to remember to emit the
+ corresponding notifier signals, to recalculate the price and update it in
+ the UI.
+ \li If more dependencies for price calculation are added in future, we'll
+ need to add more signal-slot connections and make sure all the dependencies
+ are properly updated whenever any of them changes. The overall complexity
+ will grow, and the code will become harder to maintain.
+ \li The \c Subscription and \c User classes depend on the metaobject system
+ to be able to use the signal/slot mechanism.
+ \endlist
+
+ Can we do better?
+
+ \section1 Modeling Subscription System with Bindbable Properties
+
+ Now let's see how the \l {Qt Bindable Properties} can help to solve the
+ same problem. First, let's have a look at the \c BindableSubscription class,
+ which is similar to the \c Subscription class, but is implemented using the
+ bindable properties:
+
+ \snippet bindableproperties/bindablesubscription/bindablesubscription.h bindable-subscription-class
+
+ The first difference we can notice, is that the data fields are now wrapped
+ inside \l QProperty classes, and the notifier signals (and as a consequence the
+ dependency from the metaobject system) are gone, and new methods returning a
+ \l QBindable for each \l QProperty are added instead. The \c calculatePrice()
+ and \c updateValidty() methods are also removed. We'll see below why they aren't
+ needed anymore.
+
+ The \c BindableUser class differs from the \c User class in a similar way:
+
+ \snippet bindableproperties/bindablesubscription/bindableuser.h bindable-user-class
+
+ The second differenece is in the implementation of these calsses. First of
+ all, the dependencies between \c subscription and \c user are now tracked via
+ binding expressions:
+
+ \snippet bindableproperties/bindablesubscription/bindablesubscription.cpp binding-expressions
+
+ Behind the scenes the bindable properties track the dependency changes and
+ update the property's value whenever a change is detected. So if, for example,
+ user's country or age is changed, subscription's price and validity will be
+ updated automatically.
+
+ Another difference is that the setters are now trivial:
+
+ \snippet bindableproperties/bindablesubscription/bindablesubscription.cpp set-duration
+
+ \snippet bindableproperties/bindablesubscription/bindableuser.cpp bindable-user-setters
+
+ There's no need to check inside the setters if the property's value has
+ actually changed, \l QProperty already does that. The dependent properties
+ will be notified about the change only if the value has actually changed.
+
+ The code for updating the information about the price in the UI is also
+ simplified:
+
+ \snippet bindableproperties/bindablesubscription/main.cpp update-ui
+
+ We subscribe to changes via \c bindablePrice() and \c bindableIsValid()
+ and update the price display accordingly when any of these properties
+ changes the value. The subscriptions will stay alive as long as the
+ corresponding handlers are alive.
+
+ Also note that the copy constructors of both \c BindableSubsrciption and
+ \c BindableUser are disabled, since it's not defined what should happen
+ with their bindings when copying.
+
+ As you can see, the code became much simpler, and the problems mentioned
+ above are solved:
+
+ \list
+ \li The boilerplate code for the signal-slot connections is removed, the
+ dependencies are now tracked automatically.
+ \li The code is easier to maintain. Adding more dependencies in future
+ will only require adding the corresponding bindable properties and setting
+ the binding expressions that reflect the relationships between each other.
+ \li The \c Subscription and \c User classes don't depend on the metaobject
+ system anymore. Of course, you can still expose them to the metaobject
+ system and add \l {Q_PROPERTY}s if you need, and have the advantages of
+ bindable properties both in \c C++ and \c QML code. You can use the
+ \l QObjectBindableProperty class for that.
+ \endlist
+*/
diff --git a/examples/corelib/bindableproperties/shared/countries.qrc b/examples/corelib/bindableproperties/shared/countries.qrc
new file mode 100644
index 0000000000..cdf6312ebb
--- /dev/null
+++ b/examples/corelib/bindableproperties/shared/countries.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>germany.png</file>
+ <file>norway.png</file>
+ <file>finland.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/corelib/bindableproperties/shared/finland.png b/examples/corelib/bindableproperties/shared/finland.png
new file mode 100644
index 0000000000..92653289c1
--- /dev/null
+++ b/examples/corelib/bindableproperties/shared/finland.png
Binary files differ
diff --git a/examples/corelib/bindableproperties/shared/germany.png b/examples/corelib/bindableproperties/shared/germany.png
new file mode 100644
index 0000000000..efc389f52a
--- /dev/null
+++ b/examples/corelib/bindableproperties/shared/germany.png
Binary files differ
diff --git a/examples/corelib/bindableproperties/shared/norway.png b/examples/corelib/bindableproperties/shared/norway.png
new file mode 100644
index 0000000000..daee6c3c15
--- /dev/null
+++ b/examples/corelib/bindableproperties/shared/norway.png
Binary files differ
diff --git a/examples/corelib/bindableproperties/shared/subscriptionwindow.cpp b/examples/corelib/bindableproperties/shared/subscriptionwindow.cpp
new file mode 100644
index 0000000000..03269dfa0c
--- /dev/null
+++ b/examples/corelib/bindableproperties/shared/subscriptionwindow.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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 "subscriptionwindow.h"
+#include "ui_subscriptionwindow.h"
+
+SubscriptionWindow::SubscriptionWindow(QWidget *parent)
+ : QWidget(parent), ui(new Ui::SubscriptionWindow)
+{
+ ui->setupUi(this);
+}
+
+SubscriptionWindow::~SubscriptionWindow()
+{
+ delete ui;
+}
diff --git a/examples/corelib/bindableproperties/shared/subscriptionwindow.h b/examples/corelib/bindableproperties/shared/subscriptionwindow.h
new file mode 100644
index 0000000000..9bc3acd91a
--- /dev/null
+++ b/examples/corelib/bindableproperties/shared/subscriptionwindow.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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$
+**
+****************************************************************************/
+
+#ifndef SUBSCRIPTIONWINDOW_H
+#define SUBSCRIPTIONWINDOW_H
+
+#include <QWidget>
+
+QT_BEGIN_NAMESPACE
+namespace Ui {
+class SubscriptionWindow;
+}
+QT_END_NAMESPACE
+
+class User;
+
+class SubscriptionWindow : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit SubscriptionWindow(QWidget *parent = nullptr);
+ ~SubscriptionWindow();
+
+private:
+ Ui::SubscriptionWindow *ui;
+};
+
+#endif // SUBSCRIPTIONWINDOW_H
diff --git a/examples/corelib/bindableproperties/shared/subscriptionwindow.ui b/examples/corelib/bindableproperties/shared/subscriptionwindow.ui
new file mode 100644
index 0000000000..7bc2931373
--- /dev/null
+++ b/examples/corelib/bindableproperties/shared/subscriptionwindow.ui
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SubscriptionWindow</class>
+ <widget class="QWidget" name="SubscriptionWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>639</width>
+ <height>269</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Subscription</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0,0,0,0">
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnGermany">
+ <property name="toolTip">
+ <string>Germany</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/germany.png</normaloff>:/germany.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnNorway">
+ <property name="toolTip">
+ <string>Norway</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/norway.png</normaloff>:/norway.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnFinland">
+ <property name="toolTip">
+ <string>Finland</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/finland.png</normaloff>:/finland.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="ageLabel">
+ <property name="font">
+ <font>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Age</string>
+ </property>
+ <property name="margin">
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="ageSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="intervalLabel">
+ <property name="font">
+ <font>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Interval</string>
+ </property>
+ <property name="margin">
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="btnMonthly">
+ <property name="text">
+ <string>Monthly</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="btnQuarterly">
+ <property name="text">
+ <string>Quarterly</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="btnYearly">
+ <property name="text">
+ <string>Yearly</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLabel" name="priceLabel">
+ <property name="font">
+ <font>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Price/month</string>
+ </property>
+ <property name="margin">
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="priceDisplay">
+ <property name="text">
+ <string>0.0</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/examples/corelib/bindableproperties/subscription/CMakeLists.txt b/examples/corelib/bindableproperties/subscription/CMakeLists.txt
new file mode 100644
index 0000000000..a5480e03c7
--- /dev/null
+++ b/examples/corelib/bindableproperties/subscription/CMakeLists.txt
@@ -0,0 +1,53 @@
+cmake_minimum_required(VERSION 3.16)
+project(subscription LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+ set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/corelib/bindableproperties/subscription")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Widgets)
+
+qt_add_executable(subscription
+ ../shared/subscriptionwindow.cpp ../shared/subscriptionwindow.h ../shared/subscriptionwindow.ui
+ main.cpp
+ subscription.cpp subscription.h
+ user.cpp user.h
+)
+target_link_libraries(subscription PUBLIC
+ Qt::Core
+ Qt::Gui
+ Qt::Widgets
+)
+
+
+# Resources:
+set(countries_resource_files
+ "../shared/finland.png"
+ "../shared/germany.png"
+ "../shared/norway.png"
+)
+
+qt6_add_resources(subscription "countries"
+ PREFIX
+ "/"
+ BASE
+ "../shared"
+ FILES
+ ${countries_resource_files}
+)
+
+install(TARGETS subscription
+ RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
diff --git a/examples/corelib/bindableproperties/subscription/main.cpp b/examples/corelib/bindableproperties/subscription/main.cpp
new file mode 100644
index 0000000000..6ff0c960f1
--- /dev/null
+++ b/examples/corelib/bindableproperties/subscription/main.cpp
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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 "../shared/subscriptionwindow.h"
+#include "subscription.h"
+#include "user.h"
+
+#include <QApplication>
+#include <QButtonGroup>
+#include <QLabel>
+#include <QPushButton>
+#include <QRadioButton>
+#include <QSpinBox>
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+
+//! [init]
+ User user;
+ Subscription subscription(&user);
+//! [init]
+
+ SubscriptionWindow w;
+
+ // Initialize subscription data
+ QRadioButton *monthly = w.findChild<QRadioButton *>("btnMonthly");
+ QObject::connect(monthly, &QRadioButton::clicked, &subscription, [&] {
+ subscription.setDuration(Subscription::Monthly);
+ });
+ QRadioButton *quarterly = w.findChild<QRadioButton *>("btnQuarterly");
+ QObject::connect(quarterly, &QRadioButton::clicked, &subscription, [&] {
+ subscription.setDuration(Subscription::Quarterly);
+ });
+ QRadioButton *yearly = w.findChild<QRadioButton *>("btnYearly");
+ QObject::connect(yearly, &QRadioButton::clicked, &subscription, [&] {
+ subscription.setDuration(Subscription::Yearly);
+ });
+
+ // Initialize user data
+ QPushButton *germany = w.findChild<QPushButton *>("btnGermany");
+ QObject::connect(germany, &QPushButton::clicked, &user, [&] {
+ user.setCountry(User::Germany);
+ });
+ QPushButton *finland = w.findChild<QPushButton *>("btnFinland");
+ QObject::connect(finland, &QPushButton::clicked, &user, [&] {
+ user.setCountry(User::Finland);
+ });
+ QPushButton *norway = w.findChild<QPushButton *>("btnNorway");
+ QObject::connect(norway, &QPushButton::clicked, &user, [&] {
+ user.setCountry(User::Norway);
+ });
+
+ QSpinBox *ageSpinBox = w.findChild<QSpinBox *>("ageSpinBox");
+ QObject::connect(ageSpinBox, &QSpinBox::valueChanged, &user, [&](int value) {
+ user.setAge(value);
+ });
+
+ // Initialize price data
+ QLabel *priceDisplay = w.findChild<QLabel *>("priceDisplay");
+ priceDisplay->setText(QString::number(subscription.price()));
+ priceDisplay->setEnabled(subscription.isValid());
+
+ // Track the price changes
+
+//! [connect-price-changed]
+ QObject::connect(&subscription, &Subscription::priceChanged, [&] {
+ priceDisplay->setText(QString::number(subscription.price()));
+ });
+//! [connect-price-changed]
+
+//! [connect-validity-changed]
+ QObject::connect(&subscription, &Subscription::isValidChanged, [&] {
+ priceDisplay->setEnabled(subscription.isValid());
+ });
+//! [connect-validity-changed]
+
+//! [connect-user]
+ QObject::connect(&user, &User::countryChanged, [&] {
+ subscription.calculatePrice();
+ subscription.updateValidity();
+ });
+
+ QObject::connect(&user, &User::ageChanged, [&] {
+ subscription.updateValidity();
+ });
+//! [connect-user]
+
+ w.show();
+ return a.exec();
+}
diff --git a/examples/corelib/bindableproperties/subscription/subscription.cpp b/examples/corelib/bindableproperties/subscription/subscription.cpp
new file mode 100644
index 0000000000..20efe825f3
--- /dev/null
+++ b/examples/corelib/bindableproperties/subscription/subscription.cpp
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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 "subscription.h"
+#include "user.h"
+
+Subscription::Subscription(User *user) : m_user(user)
+{
+ Q_ASSERT(user);
+}
+
+//! [calculate-price]
+
+void Subscription::calculatePrice()
+{
+ const auto oldPrice = m_price;
+
+ m_price = qRound(calculateDiscount() * m_duration * basePrice());
+ if (m_price != oldPrice)
+ emit priceChanged();
+}
+
+//! [calculate-price]
+
+//! [set-duration]
+
+void Subscription::setDuration(Duration newDuration)
+{
+ if (newDuration != m_duration) {
+ m_duration = newDuration;
+ calculatePrice();
+ emit durationChanged();
+ }
+}
+
+//! [set-duration]
+
+//! [calculate-discount]
+
+double Subscription::calculateDiscount() const
+{
+ switch (m_duration) {
+ case Monthly:
+ return 1;
+ case Quarterly:
+ return 0.9;
+ case Yearly:
+ return 0.6;
+ }
+ Q_ASSERT(false);
+ return -1;
+}
+
+//! [calculate-discount]
+
+//! [calculate-base-price]
+
+int Subscription::basePrice() const
+{
+ if (m_user->country() == User::None)
+ return 0;
+
+ return (m_user->country() == User::Norway) ? 100 : 80;
+}
+
+//! [calculate-base-price]
+
+//! [update-validity]
+
+void Subscription::updateValidity()
+{
+ bool isValid = m_isValid;
+ m_isValid = m_user->country() != User::None && m_user->age() > 12;
+
+ if (m_isValid != isValid)
+ emit isValidChanged();
+}
+
+//! [update-validity]
diff --git a/examples/corelib/bindableproperties/subscription/subscription.h b/examples/corelib/bindableproperties/subscription/subscription.h
new file mode 100644
index 0000000000..41d052e86f
--- /dev/null
+++ b/examples/corelib/bindableproperties/subscription/subscription.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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$
+**
+****************************************************************************/
+
+#ifndef SUBSCRIPTION_H
+#define SUBSCRIPTION_H
+
+#include <QObject>
+#include <QPointer>
+
+class User;
+
+//! [subscription-class]
+
+class Subscription : public QObject
+{
+ Q_OBJECT
+public:
+ enum Duration { Monthly = 1, Quarterly = 4, Yearly = 12 };
+
+ Subscription(User *user);
+
+ void calculatePrice();
+ int price() const { return m_price; }
+
+ Duration duration() const { return m_duration; }
+ void setDuration(Duration newDuration);
+
+ bool isValid() const { return m_isValid; }
+ void updateValidity();
+
+signals:
+ void priceChanged();
+ void durationChanged();
+ void isValidChanged();
+
+private:
+ double calculateDiscount() const;
+ int basePrice() const;
+
+ QPointer<User> m_user;
+ Duration m_duration = Monthly;
+ int m_price = 0;
+ bool m_isValid = false;
+};
+
+//! [subscription-class]
+
+#endif // SUBSCRIPTION_H
diff --git a/examples/corelib/bindableproperties/subscription/subscription.pro b/examples/corelib/bindableproperties/subscription/subscription.pro
new file mode 100644
index 0000000000..68910904bb
--- /dev/null
+++ b/examples/corelib/bindableproperties/subscription/subscription.pro
@@ -0,0 +1,22 @@
+QT += widgets
+TARGET = subscription
+
+SOURCES += main.cpp \
+ subscription.cpp \
+ user.cpp \
+ ../shared/subscriptionwindow.cpp
+
+target.path = $$[QT_INSTALL_EXAMPLES]/corelib/bindableproperties/subscription
+INSTALLS += target
+
+FORMS += \
+ ../shared/subscriptionwindow.ui
+
+HEADERS += \
+ subscription.h \
+ user.h \
+ ../shared/subscriptionwindow.h
+
+RESOURCES += \
+ ../shared/countries.qrc
+
diff --git a/examples/corelib/bindableproperties/subscription/user.cpp b/examples/corelib/bindableproperties/subscription/user.cpp
new file mode 100644
index 0000000000..c2b0835330
--- /dev/null
+++ b/examples/corelib/bindableproperties/subscription/user.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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 "user.h"
+
+//! [user-setters]
+
+void User::setCountry(Country country)
+{
+ if (m_country != country) {
+ m_country = country;
+ emit countryChanged();
+ }
+}
+
+void User::setAge(int age)
+{
+ if (m_age != age) {
+ m_age = age;
+ emit ageChanged();
+ }
+}
+
+//! [user-setters]
diff --git a/examples/corelib/bindableproperties/subscription/user.h b/examples/corelib/bindableproperties/subscription/user.h
new file mode 100644
index 0000000000..8c9ebb1009
--- /dev/null
+++ b/examples/corelib/bindableproperties/subscription/user.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 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$
+**
+****************************************************************************/
+
+#ifndef USER_H
+#define USER_H
+
+#include <QObject>
+
+//! [user-class]
+
+class User : public QObject
+{
+ Q_OBJECT
+
+public:
+ enum Country {
+ None,
+ Finland,
+ Germany,
+ Norway,
+ };
+
+ Country country() const { return m_country; }
+ void setCountry(Country country);
+
+ int age() const { return m_age; }
+ void setAge(int age);
+
+signals:
+ void countryChanged();
+ void ageChanged();
+
+private:
+ Country m_country = Country::None;
+ int m_age = 0;
+};
+
+//! [user-class]
+#endif // USER_H
diff --git a/examples/gui/rasterwindow/rasterwindow.h b/examples/gui/rasterwindow/rasterwindow.h
index 58c3ab89b2..279952cf61 100644
--- a/examples/gui/rasterwindow/rasterwindow.h
+++ b/examples/gui/rasterwindow/rasterwindow.h
@@ -53,6 +53,7 @@
//! [1]
#include <QtGui>
+#include <QScopedPointer>
class RasterWindow : public QWindow
{
@@ -73,7 +74,7 @@ protected:
void exposeEvent(QExposeEvent *event) override;
private:
- QBackingStore *m_backingStore;
+ QScopedPointer<QBackingStore> m_backingStore;
};
//! [1]
#endif // RASTERWINDOW_H
diff --git a/examples/network/multistreamclient/timeconsumer.cpp b/examples/network/multistreamclient/timeconsumer.cpp
index 6543e53cfc..3790bbbc3f 100644
--- a/examples/network/multistreamclient/timeconsumer.cpp
+++ b/examples/network/multistreamclient/timeconsumer.cpp
@@ -82,7 +82,7 @@ void TimeConsumer::readDatagram(const QByteArray &ba)
void TimeConsumer::timerTick()
{
QByteArray buf;
- QDataStream ds(&buf, QIODevice::WriteOnly);
+ QDataStream ds(&buf, QIODeviceBase::WriteOnly);
ds << lastTime;
emit writeDatagram(buf);
diff --git a/examples/network/multistreamserver/timeprovider.cpp b/examples/network/multistreamserver/timeprovider.cpp
index fb50baac26..dc8bca9769 100644
--- a/examples/network/multistreamserver/timeprovider.cpp
+++ b/examples/network/multistreamserver/timeprovider.cpp
@@ -71,7 +71,7 @@ void TimeProvider::readDatagram(QSctpSocket &from, const QByteArray &ba)
|| curTime.minute() != clientTime.minute()
|| curTime.hour() != clientTime.hour()) {
QByteArray buf;
- QDataStream out_ds(&buf, QIODevice::WriteOnly);
+ QDataStream out_ds(&buf, QIODeviceBase::WriteOnly);
out_ds << curTime;
emit writeDatagram(&from, buf);
diff --git a/examples/widgets/desktop/systray/doc/src/systray.qdoc b/examples/widgets/desktop/systray/doc/src/systray.qdoc
index ae7e925bd8..3a2c1bfa6b 100644
--- a/examples/widgets/desktop/systray/doc/src/systray.qdoc
+++ b/examples/widgets/desktop/systray/doc/src/systray.qdoc
@@ -173,11 +173,11 @@
We have reimplemented the QWidget::closeEvent() event handler to
receive widget close events, showing the above message to the
- users when they are closing the editor window. On \macos we need to
+ users when they are closing the editor window. We need to
avoid showing the message and accepting the close event when the
- user really intends to quit the application, that is, when the
- user has triggered "Quit" in the menu bar or pressed the Command+Q
- shortcut.
+ user really intends to quit the application: that is, when the
+ user has triggered "Quit" in the menu bar, or in the tray icon's
+ context menu, or pressed Command+Q shortcut on \macOS.
In addition to the functions and slots discussed above, we have
also implemented several convenience functions to simplify the
diff --git a/examples/widgets/desktop/systray/window.cpp b/examples/widgets/desktop/systray/window.cpp
index e62b5fc0d0..f14a4e578f 100644
--- a/examples/widgets/desktop/systray/window.cpp
+++ b/examples/widgets/desktop/systray/window.cpp
@@ -111,11 +111,8 @@ void Window::setVisible(bool visible)
//! [2]
void Window::closeEvent(QCloseEvent *event)
{
-#ifdef Q_OS_MACOS
- if (!event->spontaneous() || !isVisible()) {
+ if (!event->spontaneous() || !isVisible())
return;
- }
-#endif
if (trayIcon->isVisible()) {
QMessageBox::information(this, tr("Systray"),
tr("The program will keep running in the "
diff --git a/examples/widgets/draganddrop/puzzle/puzzlewidget.cpp b/examples/widgets/draganddrop/puzzle/puzzlewidget.cpp
index 06dda9c29f..361c7e937b 100644
--- a/examples/widgets/draganddrop/puzzle/puzzlewidget.cpp
+++ b/examples/widgets/draganddrop/puzzle/puzzlewidget.cpp
@@ -199,8 +199,8 @@ void PuzzleWidget::paintEvent(QPaintEvent *event)
const QRect PuzzleWidget::targetSquare(const QPoint &position) const
{
- return QRect(position / pieceSize() * pieceSize(),
- QSize(pieceSize(), pieceSize()));
+ QPoint topLeft = QPoint(position.x() / pieceSize(), position.y() / pieceSize()) * pieceSize();
+ return QRect(topLeft, QSize(pieceSize(), pieceSize()));
}
int PuzzleWidget::pieceSize() const
diff --git a/examples/widgets/itemviews/puzzle/puzzlewidget.cpp b/examples/widgets/itemviews/puzzle/puzzlewidget.cpp
index 2c60d28946..e5e0192c96 100644
--- a/examples/widgets/itemviews/puzzle/puzzlewidget.cpp
+++ b/examples/widgets/itemviews/puzzle/puzzlewidget.cpp
@@ -195,8 +195,8 @@ void PuzzleWidget::paintEvent(QPaintEvent *event)
const QRect PuzzleWidget::targetSquare(const QPoint &position) const
{
- return QRect(position / pieceSize() * pieceSize(),
- QSize(pieceSize(), pieceSize()));
+ QPoint topLeft = QPoint(position.x() / pieceSize(), position.y() / pieceSize()) * pieceSize();
+ return QRect(topLeft, QSize(pieceSize(), pieceSize()));
}
int PuzzleWidget::pieceSize() const
diff --git a/examples/widgets/painting/affine/xform.cpp b/examples/widgets/painting/affine/xform.cpp
index d7ed2125d2..a18d6fb71b 100644
--- a/examples/widgets/painting/affine/xform.cpp
+++ b/examples/widgets/painting/affine/xform.cpp
@@ -58,27 +58,22 @@
const int alpha = 155;
XFormView::XFormView(QWidget *parent)
- : ArthurFrame(parent)
+ : ArthurFrame(parent),
+ m_pixmap(QPixmap(":res/affine/bg1.jpg"))
{
setAttribute(Qt::WA_MouseTracking);
- m_type = VectorType;
- m_rotation = 0.0;
- m_scale = 1.0;
- m_shear = 0.0;
-
- m_pixmap = QPixmap(":res/affine/bg1.jpg");
- pts = new HoverPoints(this, HoverPoints::CircleShape);
- pts->setConnectionType(HoverPoints::LineConnection);
- pts->setEditable(false);
- pts->setPointSize(QSize(15, 15));
- pts->setShapeBrush(QBrush(QColor(151, 0, 0, alpha)));
- pts->setShapePen(QPen(QColor(255, 100, 50, alpha)));
- pts->setConnectionPen(QPen(QColor(151, 0, 0, 50)));
- pts->setBoundingRect(QRectF(0, 0, 500, 500));
- ctrlPoints << QPointF(250, 250) << QPointF(350, 250);
- pts->setPoints(ctrlPoints);
- connect(pts, &HoverPoints::pointsChanged,
- this,&XFormView::updateCtrlPoints);
+
+ m_hoverPoints = new HoverPoints(this, HoverPoints::CircleShape);
+ m_hoverPoints->setConnectionType(HoverPoints::LineConnection);
+ m_hoverPoints->setEditable(false);
+ m_hoverPoints->setPointSize(QSize(15, 15));
+ m_hoverPoints->setShapeBrush(QBrush(QColor(151, 0, 0, alpha)));
+ m_hoverPoints->setShapePen(QPen(QColor(255, 100, 50, alpha)));
+ m_hoverPoints->setConnectionPen(QPen(QColor(151, 0, 0, 50)));
+ m_hoverPoints->setBoundingRect(QRectF(0, 0, 500, 500));
+ m_hoverPoints->setPoints(m_controlPoints);
+ connect(m_hoverPoints, &HoverPoints::pointsChanged,
+ this, &XFormView::updateControlPoints);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}
@@ -122,7 +117,7 @@ void XFormView::mousePressEvent(QMouseEvent *)
void XFormView::resizeEvent(QResizeEvent *e)
{
- pts->setBoundingRect(rect());
+ m_hoverPoints->setBoundingRect(rect());
ArthurFrame::resizeEvent(e);
}
@@ -145,24 +140,24 @@ void XFormView::paint(QPainter *p)
p->restore();
}
-void XFormView::updateCtrlPoints(const QPolygonF &points)
+void XFormView::updateControlPoints(const QPolygonF &points)
{
- QPointF trans = points.at(0) - ctrlPoints.at(0);
+ QPointF trans = points.at(0) - m_controlPoints.at(0);
if (qAbs(points.at(0).x() - points.at(1).x()) < 10
&& qAbs(points.at(0).y() - points.at(1).y()) < 10)
- pts->setPoints(ctrlPoints);
+ m_hoverPoints->setPoints(m_controlPoints);
if (!trans.isNull()) {
- ctrlPoints[0] = points.at(0);
- ctrlPoints[1] += trans;
- pts->setPoints(ctrlPoints);
+ m_controlPoints[0] = points.at(0);
+ m_controlPoints[1] += trans;
+ m_hoverPoints->setPoints(m_controlPoints);
}
- ctrlPoints = points;
+ m_controlPoints = points;
- QLineF line(ctrlPoints.at(0), ctrlPoints.at(1));
+ QLineF line(m_controlPoints.at(0), m_controlPoints.at(1));
m_rotation = 360 - QLineF(0, 0, 1, 0).angleTo(line);
if (trans.isNull())
- emit rotationChanged(int(m_rotation*10));
+ emit rotationChanged(int(m_rotation * 10));
}
void XFormView::setVectorType()
@@ -222,12 +217,12 @@ void XFormView::setRotation(qreal r)
qreal old_rot = m_rotation;
m_rotation = r;
- QPointF center(pts->points().at(0));
+ QPointF center(m_hoverPoints->points().at(0));
QTransform m;
m.translate(center.x(), center.y());
m.rotate(m_rotation - old_rot);
m.translate(-center.x(), -center.y());
- pts->setPoints(pts->points() * m);
+ m_hoverPoints->setPoints(m_hoverPoints->points() * m);
update();
}
@@ -235,12 +230,12 @@ void XFormView::setRotation(qreal r)
void XFormView::timerEvent(QTimerEvent *e)
{
if (e->timerId() == timer.timerId()) {
- QPointF center(pts->points().at(0));
+ QPointF center(m_hoverPoints->points().at(0));
QTransform m;
m.translate(center.x(), center.y());
m.rotate(0.2);
m.translate(-center.x(), -center.y());
- pts->setPoints(pts->points() * m);
+ m_hoverPoints->setPoints(m_hoverPoints->points() * m);
setUpdatesEnabled(false);
static qreal scale_inc = 0.003;
@@ -253,7 +248,7 @@ void XFormView::timerEvent(QTimerEvent *e)
shear_inc = -shear_inc;
setUpdatesEnabled(true);
- pts->firePointChange();
+ m_hoverPoints->firePointChange();
}
}
@@ -271,16 +266,15 @@ void XFormView::reset()
emit rotationChanged(0);
emit scaleChanged(1000);
emit shearChanged(0);
- ctrlPoints = QPolygonF();
- ctrlPoints << QPointF(250, 250) << QPointF(350, 250);
- pts->setPoints(ctrlPoints);
- pts->firePointChange();
+ m_controlPoints = {{250, 250}, {350, 250}};
+ m_hoverPoints->setPoints(m_controlPoints);
+ m_hoverPoints->firePointChange();
}
void XFormView::drawPixmapType(QPainter *painter)
{
QPointF center(m_pixmap.width() / qreal(2), m_pixmap.height() / qreal(2));
- painter->translate(ctrlPoints.at(0) - center);
+ painter->translate(m_controlPoints.at(0) - center);
painter->translate(center);
painter->rotate(m_rotation);
@@ -289,9 +283,11 @@ void XFormView::drawPixmapType(QPainter *painter)
painter->translate(-center);
painter->drawPixmap(QPointF(0, 0), m_pixmap);
- painter->setPen(QPen(QColor(255, 0, 0, alpha), 0.25, Qt::SolidLine, Qt::FlatCap, Qt::BevelJoin));
+ painter->setPen(QPen(QColor(255, 0, 0, alpha), 0.25,
+ Qt::SolidLine, Qt::FlatCap, Qt::BevelJoin));
painter->setBrush(Qt::NoBrush);
- painter->drawRect(QRectF(0, 0, m_pixmap.width(), m_pixmap.height()).adjusted(-2, -2, 2, 2));
+ painter->drawRect(QRectF(0, 0, m_pixmap.width(),
+ m_pixmap.height()).adjusted(-2, -2, 2, 2));
}
void XFormView::drawTextType(QPainter *painter)
@@ -306,7 +302,7 @@ void XFormView::drawTextType(QPainter *painter)
QFontMetrics fm(f);
QRectF br(fm.boundingRect(m_text));
QPointF center(br.center());
- painter->translate(ctrlPoints.at(0) - center);
+ painter->translate(m_controlPoints.at(0) - center);
painter->translate(center);
painter->rotate(m_rotation);
@@ -316,7 +312,8 @@ void XFormView::drawTextType(QPainter *painter)
painter->fillPath(path, Qt::black);
- painter->setPen(QPen(QColor(255, 0, 0, alpha), 0.25, Qt::SolidLine, Qt::FlatCap, Qt::BevelJoin));
+ painter->setPen(QPen(QColor(255, 0, 0, alpha), 0.25,
+ Qt::SolidLine, Qt::FlatCap, Qt::BevelJoin));
painter->setBrush(Qt::NoBrush);
painter->drawRect(br.adjusted(-1, -1, 1, 1));
}
@@ -324,7 +321,7 @@ void XFormView::drawTextType(QPainter *painter)
void XFormView::drawVectorType(QPainter *painter)
{
QPainterPath path;
- painter->translate(ctrlPoints.at(0) - QPointF(250,250));
+ painter->translate(m_controlPoints.at(0) - QPointF(250,250));
painter->scale(0.77, 0.77);
painter->translate(98.9154 + 30 , -217.691 - 20);
@@ -339,10 +336,10 @@ void XFormView::drawVectorType(QPainter *painter)
painter->setPen(Qt::NoPen);
path.moveTo(120, 470);
- path.lineTo(60+245, 470);
- path.lineTo(60+245, 470+350);
- path.lineTo(60, 470+350);
- path.lineTo(60, 470+80);
+ path.lineTo(60 + 245, 470);
+ path.lineTo(60 + 245, 470 + 350);
+ path.lineTo(60, 470 + 350);
+ path.lineTo(60, 470 + 80);
painter->setBrush(Qt::white);
painter->drawPath(path);
diff --git a/examples/widgets/painting/affine/xform.h b/examples/widgets/painting/affine/xform.h
index 1dce3b26da..0c28435057 100644
--- a/examples/widgets/painting/affine/xform.h
+++ b/examples/widgets/painting/affine/xform.h
@@ -88,7 +88,7 @@ public:
void mousePressEvent(QMouseEvent *e) override;
void resizeEvent(QResizeEvent *e) override;
- HoverPoints *hoverPoints() { return pts; }
+ HoverPoints *hoverPoints() { return m_hoverPoints; }
bool animation() const { return timer.isActive(); }
qreal shear() const { return m_shear; }
@@ -104,7 +104,7 @@ public:
public slots:
void setAnimation(bool animate);
- void updateCtrlPoints(const QPolygonF &);
+ void updateControlPoints(const QPolygonF &);
void changeRotation(int rotation);
void changeScale(int scale);
void changeShear(int shear);
@@ -130,12 +130,12 @@ protected:
#endif
private:
- QPolygonF ctrlPoints;
- HoverPoints *pts;
- qreal m_rotation;
- qreal m_scale;
- qreal m_shear;
- XFormType m_type;
+ QPolygonF m_controlPoints{{250, 250}, {350, 250}};
+ HoverPoints *m_hoverPoints;
+ qreal m_rotation = 0;
+ qreal m_scale = 1;
+ qreal m_shear = 0;
+ XFormType m_type = VectorType;
QPixmap m_pixmap;
QString m_text;
QBasicTimer timer;
diff --git a/examples/widgets/painting/deform/pathdeform.cpp b/examples/widgets/painting/deform/pathdeform.cpp
index acf0191260..998b6a53a1 100644
--- a/examples/widgets/painting/deform/pathdeform.cpp
+++ b/examples/widgets/painting/deform/pathdeform.cpp
@@ -481,7 +481,7 @@ void PathDeformRenderer::timerEvent(QTimerEvent *e)
void PathDeformRenderer::mousePressEvent(QMouseEvent *e)
{
- if (m_show_doc) {
+ if (m_showDoc) {
setDescriptionEnabled(false);
return;
}
diff --git a/examples/widgets/painting/shared/arthurwidgets.cpp b/examples/widgets/painting/shared/arthurwidgets.cpp
index 667246b79a..61e73c4a60 100644
--- a/examples/widgets/painting/shared/arthurwidgets.cpp
+++ b/examples/widgets/painting/shared/arthurwidgets.cpp
@@ -70,28 +70,15 @@
extern QPixmap cached(const QString &img);
ArthurFrame::ArthurFrame(QWidget *parent)
- : QWidget(parent)
- , m_prefer_image(false)
+ : QWidget(parent),
+ m_tile(QPixmap(128, 128))
{
-#if QT_CONFIG(opengl)
- m_glWindow = nullptr;
- m_glWidget = nullptr;
- m_use_opengl = false;
-#endif
- m_document = nullptr;
- m_show_doc = false;
-
- m_tile = QPixmap(128, 128);
m_tile.fill(Qt::white);
QPainter pt(&m_tile);
QColor color(230, 230, 230);
pt.fillRect(0, 0, 64, 64, color);
pt.fillRect(64, 64, 64, 64, color);
pt.end();
-
-// QPalette pal = palette();
-// pal.setBrush(backgroundRole(), m_tile);
-// setPalette(pal);
}
@@ -209,7 +196,7 @@ void ArthurFrame::paintEvent(QPaintEvent *e)
painter.restore();
painter.save();
- if (m_show_doc)
+ if (m_showDoc)
paintDescription(&painter);
painter.restore();
@@ -244,9 +231,9 @@ void ArthurFrame::resizeEvent(QResizeEvent *e)
void ArthurFrame::setDescriptionEnabled(bool enabled)
{
- if (m_show_doc != enabled) {
- m_show_doc = enabled;
- emit descriptionEnabledChanged(m_show_doc);
+ if (m_showDoc != enabled) {
+ m_showDoc = enabled;
+ emit descriptionEnabledChanged(m_showDoc);
update();
}
}
@@ -276,9 +263,8 @@ void ArthurFrame::paintDescription(QPainter *painter)
int pageWidth = qMax(width() - 100, 100);
int pageHeight = qMax(height() - 100, 100);
- if (pageWidth != m_document->pageSize().width()) {
+ if (pageWidth != m_document->pageSize().width())
m_document->setPageSize(QSize(pageWidth, pageHeight));
- }
QRect textRect(width() / 2 - pageWidth / 2,
height() / 2 - pageHeight / 2,
@@ -340,7 +326,7 @@ void ArthurFrame::showSource()
if (!f.open(QFile::ReadOnly))
contents = tr("Could not open file: '%1'").arg(m_sourceFileName);
else
- contents = f.readAll();
+ contents = QString::fromUtf8(f.readAll());
}
contents.replace(QLatin1Char('&'), QStringLiteral("&amp;"));
diff --git a/examples/widgets/painting/shared/arthurwidgets.h b/examples/widgets/painting/shared/arthurwidgets.h
index 73e1310c0e..69fee57a27 100644
--- a/examples/widgets/painting/shared/arthurwidgets.h
+++ b/examples/widgets/painting/shared/arthurwidgets.h
@@ -69,7 +69,6 @@ public:
ArthurFrame(QWidget *parent);
virtual void paint(QPainter *) {}
-
void paintDescription(QPainter *p);
void loadDescription(const QString &filename);
@@ -77,13 +76,13 @@ public:
void loadSourceFile(const QString &fileName);
- bool preferImage() const { return m_prefer_image; }
+ bool preferImage() const { return m_preferImage; }
#if QT_CONFIG(opengl)
QOpenGLWindow *glWindow() const { return m_glWindow; }
#endif
public slots:
- void setPreferImage(bool pi) { m_prefer_image = pi; }
+ void setPreferImage(bool pi) { m_preferImage = pi; }
void setDescriptionEnabled(bool enabled);
void showSource();
@@ -101,18 +100,17 @@ protected:
#if QT_CONFIG(opengl)
virtual void createGlWindow();
- QOpenGLWindow *m_glWindow;
- QWidget *m_glWidget;
- bool m_use_opengl;
+ QOpenGLWindow *m_glWindow = nullptr;
+ QWidget *m_glWidget = nullptr;
+ bool m_use_opengl = false;
#endif
QPixmap m_tile;
- bool m_show_doc;
- bool m_prefer_image;
- QTextDocument *m_document;
+ bool m_showDoc = false;
+ bool m_preferImage = false;
+ QTextDocument *m_document = nullptr;;
QString m_sourceFileName;
-
};
#endif
diff --git a/examples/widgets/painting/shared/hoverpoints.cpp b/examples/widgets/painting/shared/hoverpoints.cpp
index 417d593d04..ea59694f92 100644
--- a/examples/widgets/painting/shared/hoverpoints.cpp
+++ b/examples/widgets/painting/shared/hoverpoints.cpp
@@ -57,31 +57,18 @@
#include <QtOpenGL/QOpenGLWindow>
#endif
-#define printf
-
HoverPoints::HoverPoints(QWidget *widget, PointShape shape)
- : QObject(widget)
+ : QObject(widget),
+ m_widget(widget),
+ m_shape(shape)
{
- m_widget = widget;
widget->installEventFilter(this);
widget->setAttribute(Qt::WA_AcceptTouchEvents);
- m_connectionType = CurveConnection;
- m_sortType = NoSort;
- m_shape = shape;
- m_pointPen = QPen(QColor(255, 255, 255, 191), 1);
- m_connectionPen = QPen(QColor(255, 255, 255, 127), 2);
- m_pointBrush = QBrush(QColor(191, 191, 191, 127));
- m_pointSize = QSize(11, 11);
- m_currentIndex = -1;
- m_editable = true;
- m_enabled = true;
-
connect(this, &HoverPoints::pointsChanged,
m_widget, QOverload<>::of(&QWidget::update));
}
-
void HoverPoints::setEnabled(bool enabled)
{
if (m_enabled != enabled) {
@@ -90,191 +77,197 @@ void HoverPoints::setEnabled(bool enabled)
}
}
-
bool HoverPoints::eventFilter(QObject *object, QEvent *event)
{
- if (object == m_widget && m_enabled) {
- switch (event->type()) {
+ if (object != m_widget || !m_enabled)
+ return false;
- case QEvent::MouseButtonPress:
- {
- if (!m_fingerPointMapping.isEmpty())
- return true;
- QMouseEvent *me = (QMouseEvent *) event;
-
- QPointF clickPos = me->position().toPoint();
- int index = -1;
- for (int i=0; i<m_points.size(); ++i) {
- QPainterPath path;
- if (m_shape == CircleShape)
- path.addEllipse(pointBoundingRect(i));
- else
- path.addRect(pointBoundingRect(i));
-
- if (path.contains(clickPos)) {
- index = i;
- break;
- }
+ switch (event->type()) {
+ case QEvent::MouseButtonPress:
+ {
+ if (!m_fingerPointMapping.isEmpty())
+ return true;
+ auto *me = static_cast<const QMouseEvent *>(event);
+ QPointF clickPos = me->position().toPoint();
+ qsizetype index = -1;
+ for (qsizetype i = 0; i < m_points.size(); ++i) {
+ QPainterPath path;
+ const QRectF rect = pointBoundingRect(m_points.at(i));
+ if (m_shape == CircleShape)
+ path.addEllipse(rect);
+ else
+ path.addRect(rect);
+
+ if (path.contains(clickPos)) {
+ index = i;
+ break;
}
+ }
- if (me->button() == Qt::LeftButton) {
- if (index == -1) {
- if (!m_editable)
- return false;
- int pos = 0;
- // Insert sort for x or y
- if (m_sortType == XSort) {
- for (int i=0; i<m_points.size(); ++i)
- if (m_points.at(i).x() > clickPos.x()) {
- pos = i;
- break;
- }
- } else if (m_sortType == YSort) {
- for (int i=0; i<m_points.size(); ++i)
- if (m_points.at(i).y() > clickPos.y()) {
- pos = i;
- break;
- }
+ if (me->button() == Qt::LeftButton) {
+ if (index == -1) {
+ if (!m_editable)
+ return false;
+ qsizetype pos = 0;
+ // Insert sort for x or y
+ switch (m_sortType) {
+ case XSort:
+ for (qsizetype i = 0; i < m_points.size(); ++i) {
+ if (m_points.at(i).x() > clickPos.x()) {
+ pos = i;
+ break;
+ }
}
-
- m_points.insert(pos, clickPos);
- m_locks.insert(pos, 0);
- m_currentIndex = pos;
- firePointChange();
- } else {
- m_currentIndex = index;
- }
- return true;
-
- } else if (me->button() == Qt::RightButton) {
- if (index >= 0 && m_editable) {
- if (m_locks[index] == 0) {
- m_locks.remove(index);
- m_points.remove(index);
+ break;
+ case YSort:
+ for (qsizetype i = 0; i < m_points.size(); ++i) {
+ if (m_points.at(i).y() > clickPos.y()) {
+ pos = i;
+ break;
+ }
}
- firePointChange();
- return true;
+ break;
+ default:
+ break;
}
+
+ m_points.insert(pos, clickPos);
+ m_locks.insert(pos, 0);
+ m_currentIndex = pos;
+ firePointChange();
+ } else {
+ m_currentIndex = index;
}
+ return true;
+ } else if (me->button() == Qt::RightButton) {
+ if (index >= 0 && m_editable) {
+ if (m_locks[index] == 0) {
+ m_locks.remove(index);
+ m_points.remove(index);
+ }
+ firePointChange();
+ return true;
+ }
}
+ }
+ break;
+
+ case QEvent::MouseButtonRelease:
+ if (!m_fingerPointMapping.isEmpty())
+ return true;
+ m_currentIndex = -1;
break;
- case QEvent::MouseButtonRelease:
- if (!m_fingerPointMapping.isEmpty())
- return true;
- m_currentIndex = -1;
- break;
+ case QEvent::MouseMove:
+ if (!m_fingerPointMapping.isEmpty())
+ return true;
+ if (m_currentIndex >= 0) {
+ auto *me = static_cast<const QMouseEvent *>(event);
+ movePoint(m_currentIndex, me->position().toPoint());
+ }
+ break;
- case QEvent::MouseMove:
- if (!m_fingerPointMapping.isEmpty())
- return true;
- if (m_currentIndex >= 0)
- movePoint(m_currentIndex, ((QMouseEvent *)event)->position().toPoint());
- break;
- case QEvent::TouchBegin:
- case QEvent::TouchUpdate:
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate:
+ {
+ auto *touchEvent = static_cast<const QTouchEvent*>(event);
+ const auto points = touchEvent->points();
+ const qreal pointSize = qMax(m_pointSize.width(), m_pointSize.height());
+ for (const auto &point : points) {
+ const int id = point.id();
+ switch (point.state()) {
+ case QEventPoint::Pressed:
{
- const QTouchEvent *const touchEvent = static_cast<const QTouchEvent*>(event);
- const auto points = touchEvent->points();
- const qreal pointSize = qMax(m_pointSize.width(), m_pointSize.height());
- for (const auto &point : points) {
- const int id = point.id();
- switch (point.state()) {
- case QEventPoint::Pressed:
- {
- // find the point, move it
- const auto mappedPoints = m_fingerPointMapping.values();
- QSet<int> activePoints = QSet<int>(mappedPoints.begin(), mappedPoints.end());
- int activePoint = -1;
- qreal distance = -1;
- const int pointsCount = m_points.size();
- const int activePointCount = activePoints.size();
- if (pointsCount == 2 && activePointCount == 1) { // only two points
- activePoint = activePoints.contains(0) ? 1 : 0;
- } else {
- for (int i=0; i<pointsCount; ++i) {
- if (activePoints.contains(i))
- continue;
-
- qreal d = QLineF(point.position(), m_points.at(i)).length();
- if ((distance < 0 && d < 12 * pointSize) || d < distance) {
- distance = d;
- activePoint = i;
- }
-
- }
- }
- if (activePoint != -1) {
- m_fingerPointMapping.insert(point.id(), activePoint);
- movePoint(activePoint, point.position());
- }
- }
- break;
- case QEventPoint::Released:
- {
- // move the point and release
- QHash<int,int>::iterator it = m_fingerPointMapping.find(id);
- movePoint(it.value(), point.position());
- m_fingerPointMapping.erase(it);
- }
- break;
- case QEventPoint::Updated:
- {
- // move the point
- const int pointIdx = m_fingerPointMapping.value(id, -1);
- if (pointIdx >= 0) // do we track this point?
- movePoint(pointIdx, point.position());
+ // find the point, move it
+ const auto mappedPoints = m_fingerPointMapping.values();
+ QSet<qsizetype> activePoints(mappedPoints.begin(), mappedPoints.end());
+ qsizetype activePoint = -1;
+ qreal distance = -1;
+ const qsizetype pointsCount = m_points.size();
+ const qsizetype activePointCount = activePoints.size();
+ if (pointsCount == 2 && activePointCount == 1) { // only two points
+ activePoint = activePoints.contains(0) ? 1 : 0;
+ } else {
+ for (qsizetype i = 0; i < pointsCount; ++i) {
+ if (activePoints.contains(i))
+ continue;
+
+ qreal d = QLineF(point.position(), m_points.at(i)).length();
+ if ((distance < 0 && d < 12 * pointSize) || d < distance) {
+ distance = d;
+ activePoint = i;
}
- break;
- default:
- break;
+
}
}
- if (m_fingerPointMapping.isEmpty()) {
- event->ignore();
- return false;
- } else {
- return true;
+ if (activePoint != -1) {
+ m_fingerPointMapping.insert(point.id(), activePoint);
+ movePoint(activePoint, point.position());
}
}
break;
- case QEvent::TouchEnd:
- if (m_fingerPointMapping.isEmpty()) {
- event->ignore();
- return false;
+ case QEventPoint::Released:
+ {
+ // move the point and release
+ const auto it = m_fingerPointMapping.find(id);
+ movePoint(it.value(), point.position());
+ m_fingerPointMapping.erase(it);
}
- return true;
break;
-
- case QEvent::Resize:
- {
- QResizeEvent *e = (QResizeEvent *) event;
- if (e->oldSize().width() == 0 || e->oldSize().height() == 0)
- break;
- qreal stretch_x = e->size().width() / qreal(e->oldSize().width());
- qreal stretch_y = e->size().height() / qreal(e->oldSize().height());
- for (int i=0; i<m_points.size(); ++i) {
- QPointF p = m_points[i];
- movePoint(i, QPointF(p.x() * stretch_x, p.y() * stretch_y), false);
+ case QEventPoint::Updated:
+ {
+ // move the point
+ const qsizetype pointIdx = m_fingerPointMapping.value(id, -1);
+ if (pointIdx >= 0) // do we track this point?
+ movePoint(pointIdx, point.position());
}
-
- firePointChange();
break;
+ default:
+ break;
+ }
}
-
- case QEvent::Paint:
- {
- QWidget *that_widget = m_widget;
- m_widget = nullptr;
- QCoreApplication::sendEvent(object, event);
- m_widget = that_widget;
- paintPoints();
- return true;
+ if (m_fingerPointMapping.isEmpty()) {
+ event->ignore();
+ return false;
+ }
+ return true;
+ }
+ case QEvent::TouchEnd:
+ if (m_fingerPointMapping.isEmpty()) {
+ event->ignore();
+ return false;
}
- default:
+ return true;
+
+ case QEvent::Resize:
+ {
+ auto *e = static_cast<const QResizeEvent *>(event);
+ if (e->oldSize().width() <= 0 || e->oldSize().height() <= 0)
break;
+ qreal stretch_x = e->size().width() / qreal(e->oldSize().width());
+ qreal stretch_y = e->size().height() / qreal(e->oldSize().height());
+ for (qsizetype i = 0; i < m_points.size(); ++i) {
+ QPointF p = m_points.at(i);
+ movePoint(i, QPointF(p.x() * stretch_x, p.y() * stretch_y), false);
}
+
+ firePointChange();
+ break;
+ }
+
+ case QEvent::Paint:
+ {
+ QWidget *that_widget = m_widget;
+ m_widget = nullptr;
+ QCoreApplication::sendEvent(object, event);
+ m_widget = that_widget;
+ paintPoints();
+ return true;
+ }
+
+ default:
+ break;
}
return false;
@@ -304,8 +297,8 @@ void HoverPoints::paintPoints()
if (m_connectionType == CurveConnection) {
QPainterPath path;
path.moveTo(m_points.at(0));
- for (int i=1; i<m_points.size(); ++i) {
- QPointF p1 = m_points.at(i-1);
+ for (qsizetype i = 1; i < m_points.size(); ++i) {
+ QPointF p1 = m_points.at(i - 1);
QPointF p2 = m_points.at(i);
qreal distance = p2.x() - p1.x();
@@ -322,8 +315,8 @@ void HoverPoints::paintPoints()
p.setPen(m_pointPen);
p.setBrush(m_pointBrush);
- for (int i=0; i<m_points.size(); ++i) {
- QRectF bounds = pointBoundingRect(i);
+ for (const auto &point : qAsConst(m_points)) {
+ QRectF bounds = pointBoundingRect(point);
if (m_shape == CircleShape)
p.drawEllipse(bounds);
else
@@ -354,32 +347,28 @@ void HoverPoints::setPoints(const QPolygonF &points)
if (points.size() != m_points.size())
m_fingerPointMapping.clear();
m_points.clear();
- for (int i=0; i<points.size(); ++i)
+ for (qsizetype i = 0; i < points.size(); ++i)
m_points << bound_point(points.at(i), boundingRect(), 0);
m_locks.clear();
if (m_points.size() > 0) {
m_locks.resize(m_points.size());
-
m_locks.fill(0);
}
}
-
-void HoverPoints::movePoint(int index, const QPointF &point, bool emitUpdate)
+void HoverPoints::movePoint(qsizetype index, const QPointF &point, bool emitUpdate)
{
m_points[index] = bound_point(point, boundingRect(), m_locks.at(index));
if (emitUpdate)
firePointChange();
}
-
inline static bool x_less_than(const QPointF &p1, const QPointF &p2)
{
return p1.x() < p2.x();
}
-
inline static bool y_less_than(const QPointF &p1, const QPointF &p2)
{
return p1.y() < p2.y();
@@ -387,14 +376,11 @@ inline static bool y_less_than(const QPointF &p1, const QPointF &p2)
void HoverPoints::firePointChange()
{
-// printf("HoverPoints::firePointChange(), current=%d\n", m_currentIndex);
-
if (m_sortType != NoSort) {
QPointF oldCurrent;
- if (m_currentIndex != -1) {
+ if (m_currentIndex != -1)
oldCurrent = m_points[m_currentIndex];
- }
if (m_sortType == XSort)
std::sort(m_points.begin(), m_points.end(), x_less_than);
@@ -403,22 +389,14 @@ void HoverPoints::firePointChange()
// Compensate for changed order...
if (m_currentIndex != -1) {
- for (int i=0; i<m_points.size(); ++i) {
+ for (qsizetype i = 0; i < m_points.size(); ++i) {
if (m_points[i] == oldCurrent) {
m_currentIndex = i;
break;
}
}
}
-
-// printf(" - firePointChange(), current=%d\n", m_currentIndex);
-
}
-// for (int i=0; i<m_points.size(); ++i) {
-// printf(" - point(%2d)=[%.2f, %.2f], lock=%d\n",
-// i, m_points.at(i).x(), m_points.at(i).y(), m_locks.at(i));
-// }
-
emit pointsChanged(m_points);
}
diff --git a/examples/widgets/painting/shared/hoverpoints.h b/examples/widgets/painting/shared/hoverpoints.h
index 3c6f356e1b..8b341197d2 100644
--- a/examples/widgets/painting/shared/hoverpoints.h
+++ b/examples/widgets/painting/shared/hoverpoints.h
@@ -124,35 +124,33 @@ public:
void firePointChange();
private:
- inline QRectF pointBoundingRect(int i) const;
- void movePoint(int i, const QPointF &newPos, bool emitChange = true);
+ inline QRectF pointBoundingRect(const QPointF &p) const;
+ void movePoint(qsizetype i, const QPointF &newPos, bool emitChange = true);
QWidget *m_widget;
QPolygonF m_points;
QRectF m_bounds;
PointShape m_shape;
- SortType m_sortType;
- ConnectionType m_connectionType;
+ SortType m_sortType = NoSort;
+ ConnectionType m_connectionType = CurveConnection;
QList<uint> m_locks;
- QSizeF m_pointSize;
- int m_currentIndex;
- bool m_editable;
- bool m_enabled;
+ QSizeF m_pointSize{11, 11};
+ qsizetype m_currentIndex= -1;
+ bool m_editable = true;
+ bool m_enabled = true;
- QHash<int, int> m_fingerPointMapping;
+ QHash<int, qsizetype> m_fingerPointMapping;
- QPen m_pointPen;
- QBrush m_pointBrush;
- QPen m_connectionPen;
+ QPen m_pointPen{QColor(255, 255, 255, 191), 1};
+ QBrush m_pointBrush{QColor(191, 191, 191, 127)};
+ QPen m_connectionPen{QColor(255, 255, 255, 127), 2};
};
-
-inline QRectF HoverPoints::pointBoundingRect(int i) const
+inline QRectF HoverPoints::pointBoundingRect(const QPointF &p) const
{
- QPointF p = m_points.at(i);
qreal w = m_pointSize.width();
qreal h = m_pointSize.height();
qreal x = p.x() - w / 2;
diff --git a/examples/widgets/qnx/foreignwindows/collector.cpp b/examples/widgets/qnx/foreignwindows/collector.cpp
index 4b9e774945..f5406da793 100644
--- a/examples/widgets/qnx/foreignwindows/collector.cpp
+++ b/examples/widgets/qnx/foreignwindows/collector.cpp
@@ -63,7 +63,7 @@ Collector::~Collector()
QApplication::instance()->removeNativeEventFilter(this);
}
-bool Collector::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
+bool Collector::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result)
{
Q_UNUSED(result);
diff --git a/examples/widgets/qnx/foreignwindows/collector.h b/examples/widgets/qnx/foreignwindows/collector.h
index 7c0b2e5cb6..1675099437 100644
--- a/examples/widgets/qnx/foreignwindows/collector.h
+++ b/examples/widgets/qnx/foreignwindows/collector.h
@@ -52,7 +52,7 @@ public:
explicit Collector(QWidget *parent = nullptr);
~Collector() override;
- bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
+ bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override;
private:
struct Collectible
diff --git a/examples/widgets/richtext/textedit/example.html b/examples/widgets/richtext/textedit/example.html
index 99090a697f..ca3dce23cc 100644
--- a/examples/widgets/richtext/textedit/example.html
+++ b/examples/widgets/richtext/textedit/example.html
@@ -1,6 +1,8 @@
-<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>QTextEdit Example</title><style type="text/css">
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><title>QTextEdit Example</title><style type="text/css">
p, li { white-space: pre-wrap; }
-</style></head><body style=" font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
+hr { height: 1px; border-width: 0; }
+</style></head><body style=" font-family:'Helvetica'; font-size:9pt; font-weight:400; font-style:normal;">
<h1 align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt; font-weight:600;">QTextEdit</span></h1>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">The QTextEdit widget is an advanced editor that supports formatted rich text. It can be used to display HTML and other rich document formats. Internally, QTextEdit uses the QTextDocument class to describe both the high-level structure of each document and the low-level formatting of paragraphs.</span></p>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">If you are viewing this document in the <span style=" font-style:italic;">textedit</span> example, you can edit this document to explore Qt's rich text editing features. We have included some comments in each of the following sections to encourage you to experiment. </p>
@@ -27,6 +29,9 @@ p, li { white-space: pre-wrap; }
<h2 style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Images</span></h2>
<p style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"><span style=" font-size:11pt; font-weight:400;">Inline images are treated like ordinary ranges of characters in the text editor, so they flow with the surrounding text. Images can also be selected in the same way as text, making it easy to cut, copy, and paste them. </span></p>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><img src=":/images/logo32.png" /><span style=" font-style:italic;"> Try to select this image by clicking and dragging over it with the mouse, or use the text cursor to select it by holding down Shift and using the arrow keys. You can then cut or copy it, and paste it into different parts of this document.</span></p>
+<h2 align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">Horizontal Rule</span></h2>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here is an example:</p>
+<hr width="50%" style=" background-color:green;"/>
<h2 align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Tables</span></h2>
<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"><span style=" font-size:11pt; font-weight:400;">QTextEdit can arrange and format tables, supporting features such as row and column spans, text formatting within cells, and size constraints for columns. </span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p>
diff --git a/examples/widgets/tools/echoplugin/echowindow/CMakeLists.txt b/examples/widgets/tools/echoplugin/echowindow/CMakeLists.txt
index 83f0c88456..3fcbe17172 100644
--- a/examples/widgets/tools/echoplugin/echowindow/CMakeLists.txt
+++ b/examples/widgets/tools/echoplugin/echowindow/CMakeLists.txt
@@ -22,4 +22,5 @@ endif()
install(TARGETS echopluginwindow
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)
diff --git a/examples/widgets/tools/plugandpaint/app/CMakeLists.txt b/examples/widgets/tools/plugandpaint/app/CMakeLists.txt
index e3709ee0d3..3e46331f81 100644
--- a/examples/widgets/tools/plugandpaint/app/CMakeLists.txt
+++ b/examples/widgets/tools/plugandpaint/app/CMakeLists.txt
@@ -23,4 +23,5 @@ endif()
install(TARGETS plugandpaint
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)
diff --git a/examples/widgets/tools/styleplugin/stylewindow/CMakeLists.txt b/examples/widgets/tools/styleplugin/stylewindow/CMakeLists.txt
index 168c41fb60..aab63afbf2 100644
--- a/examples/widgets/tools/styleplugin/stylewindow/CMakeLists.txt
+++ b/examples/widgets/tools/styleplugin/stylewindow/CMakeLists.txt
@@ -20,4 +20,5 @@ endif()
install(TARGETS styleplugin
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)
diff --git a/examples/widgets/tools/treemodelcompleter/mainwindow.cpp b/examples/widgets/tools/treemodelcompleter/mainwindow.cpp
index 44c5b1312a..0c6bb66103 100644
--- a/examples/widgets/tools/treemodelcompleter/mainwindow.cpp
+++ b/examples/widgets/tools/treemodelcompleter/mainwindow.cpp
@@ -206,7 +206,7 @@ QAbstractItemModel *MainWindow::modelFromFile(const QString &fileName)
QRegularExpression re("^\\s+");
while (!file.atEnd()) {
- const QString line = QString::fromUtf8(file.readLine()).trimmed();
+ const QString line = QString::fromUtf8(file.readLine());
const QString trimmedLine = line.trimmed();
if (trimmedLine.isEmpty())
continue;
@@ -218,7 +218,7 @@ QAbstractItemModel *MainWindow::modelFromFile(const QString &fileName)
level = 0;
} else {
const int capLen = match.capturedLength();
- level = line.startsWith(QLatin1Char('\t')) ? capLen / 4 : capLen;
+ level = capLen / 4;
}
if (level + 1 >= parents.size())
@@ -267,4 +267,3 @@ void MainWindow::updateContentsLabel(const QString &sep)
{
contentsLabel->setText(tr("Type path from model above with items at each level separated by a '%1'").arg(sep));
}
-
diff --git a/examples/widgets/widgets/tetrix/tetrixwindow.cpp b/examples/widgets/widgets/tetrix/tetrixwindow.cpp
index 5aa5c3f615..c2e5129522 100644
--- a/examples/widgets/widgets/tetrix/tetrixwindow.cpp
+++ b/examples/widgets/widgets/tetrix/tetrixwindow.cpp
@@ -89,21 +89,12 @@ TetrixWindow::TetrixWindow(QWidget *parent)
//! [4] //! [5]
connect(quitButton , &QPushButton::clicked, qApp, &QCoreApplication::quit);
connect(pauseButton, &QPushButton::clicked, board, &TetrixBoard::pause);
-#if __cplusplus >= 201402L
connect(board, &TetrixBoard::scoreChanged,
scoreLcd, qOverload<int>(&QLCDNumber::display));
connect(board, &TetrixBoard::levelChanged,
levelLcd, qOverload<int>(&QLCDNumber::display));
connect(board, &TetrixBoard::linesRemovedChanged,
linesLcd, qOverload<int>(&QLCDNumber::display));
-#else
- connect(board, &TetrixBoard::scoreChanged,
- scoreLcd, QOverload<int>::of(&QLCDNumber::display));
- connect(board, &TetrixBoard::levelChanged,
- levelLcd, QOverload<int>::of(&QLCDNumber::display));
- connect(board, &TetrixBoard::linesRemovedChanged,
- linesLcd, QOverload<int>::of(&QLCDNumber::display));
-#endif
//! [5]
//! [6]