diff options
author | Oliver Eftevaag <[email protected]> | 2025-03-25 13:32:43 +0100 |
---|---|---|
committer | Oliver Eftevaag <[email protected]> | 2025-05-07 22:22:49 +0200 |
commit | d8ac4cd8692e77c85ac8c6bcfa0a1556c7a72ee9 (patch) | |
tree | 254966c24ea43db05b3278bf3d65e6a85ac87e4e | |
parent | e808b38d4bb894f42b7dfe52f1ef67a0d48c23ff (diff) |
Add constant property QStyleHints::accessibility
This property bundles together accessibility settings that can be used
by styles to change how they draw different widgets and/or controls.
The only property that it contains currently is contrastPreference.
This property can be used to determine if the user has enabled a high
contrast setting on the platform that the Qt application is running on.
We might add more *accessibility* settings, like color blind hints, to
QAccessibilityHints in the future.
[ChangeLog][Gui][QStyleHints] Added class QAccessibilityHints, which can be
accessed from QStyleHints. This singleton contains a single property
contrastPreference which can be used to determine if the platform has
enabled a high contrast setting or not. More accessibility settings
might be added to QAccessibilityHints in the future.
Task-number: QTBUG-133595
Change-Id: I93c6be81d29f65058eeda00328f4d9e966921de6
Reviewed-by: Morten Johan Sørvig <[email protected]>
-rw-r--r-- | src/gui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/gui/kernel/qaccessibilityhints.cpp | 61 | ||||
-rw-r--r-- | src/gui/kernel/qaccessibilityhints.h | 30 | ||||
-rw-r--r-- | src/gui/kernel/qaccessibilityhints_p.h | 37 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 8 | ||||
-rw-r--r-- | src/gui/kernel/qstylehints.cpp | 37 | ||||
-rw-r--r-- | src/gui/kernel/qstylehints.h | 4 | ||||
-rw-r--r-- | src/gui/kernel/qstylehints_p.h | 5 |
8 files changed, 176 insertions, 7 deletions
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 0c61640bcbb..ba77cb1cccc 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -90,6 +90,7 @@ qt_internal_add_module(Gui image/qppmhandler.cpp image/qppmhandler_p.h image/qxbmhandler.cpp image/qxbmhandler_p.h image/qxpmhandler.cpp image/qxpmhandler_p.h + kernel/qaccessibilityhints.cpp kernel/qaccessibilityhints.h kernel/qaccessibilityhints_p.h kernel/qclipboard.cpp kernel/qclipboard.h kernel/qcursor.cpp kernel/qcursor.h kernel/qcursor_p.h kernel/qeventpoint.cpp kernel/qeventpoint.h kernel/qeventpoint_p.h diff --git a/src/gui/kernel/qaccessibilityhints.cpp b/src/gui/kernel/qaccessibilityhints.cpp new file mode 100644 index 00000000000..0d072550004 --- /dev/null +++ b/src/gui/kernel/qaccessibilityhints.cpp @@ -0,0 +1,61 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qaccessibilityhints.h" +#include "qaccessibilityhints_p.h" + +QT_BEGIN_NAMESPACE + +void QAccessibilityHintsPrivate::updateContrastPreference(Qt::ContrastPreference contrastPreference) +{ + if (m_contrastPreference == contrastPreference) + return; + m_contrastPreference = contrastPreference; + + Q_Q(QAccessibilityHints); + emit q->contrastPreferenceChanged(contrastPreference); +} + +QAccessibilityHintsPrivate *QAccessibilityHintsPrivate::get(QAccessibilityHints *q) +{ + Q_ASSERT(q); + return q->d_func(); +} + +/*! + \class QAccessibilityHints + \since 6.10 + \brief The QAccessibilityHints class contains platform specific accessibility hints and settings. + \inmodule QtGui + + This class bundles together platform specific accessibility settings, and can be accessed from + \l QStyleHints::accessibility. + + \sa QStyleHints +*/ + +QAccessibilityHints::QAccessibilityHints(QObject *parent) + : QObject(*(new QAccessibilityHintsPrivate), parent) +{} + +/*! + \property QAccessibilityHints::contrastPreference + \brief The contrast mode set by the system. + + This property can be used by the application to determine what contrast settings the system + is currently using. + + Qt styles use this property in order to adjust palette colors and outlines. + + \sa Qt::ColorScheme, QGuiApplication::palette(), QEvent::PaletteChange + \since 6.10 +*/ +Qt::ContrastPreference QAccessibilityHints::contrastPreference() const +{ + Q_D(const QAccessibilityHints); + return d->m_contrastPreference; +} + +QT_END_NAMESPACE + +#include "moc_qaccessibilityhints.cpp" diff --git a/src/gui/kernel/qaccessibilityhints.h b/src/gui/kernel/qaccessibilityhints.h new file mode 100644 index 00000000000..c0d5908a23f --- /dev/null +++ b/src/gui/kernel/qaccessibilityhints.h @@ -0,0 +1,30 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QACCESSIBILITYHINTS_H +#define QACCESSIBILITYHINTS_H + +#include <QtGui/qtguiglobal.h> +#include <QtCore/qobject.h> + +QT_BEGIN_NAMESPACE + +class QAccessibilityHintsPrivate; + +class Q_GUI_EXPORT QAccessibilityHints : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QAccessibilityHints) + Q_PROPERTY(Qt::ContrastPreference contrastPreference READ contrastPreference NOTIFY contrastPreferenceChanged FINAL REVISION(6, 10)) + +public: + explicit QAccessibilityHints(QObject *parent = nullptr); + Qt::ContrastPreference contrastPreference() const; + +Q_SIGNALS: + void contrastPreferenceChanged(Qt::ContrastPreference contrastPreference); +}; + +QT_END_NAMESPACE + +#endif // QACCESSIBILITYHINTS_H diff --git a/src/gui/kernel/qaccessibilityhints_p.h b/src/gui/kernel/qaccessibilityhints_p.h new file mode 100644 index 00000000000..49033f7aa11 --- /dev/null +++ b/src/gui/kernel/qaccessibilityhints_p.h @@ -0,0 +1,37 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QACCESSIBILITYHINTS_P_H +#define QACCESSIBILITYHINTS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qaccessibilityhints.h" + +#include <QtCore/private/qobject_p.h> + +QT_BEGIN_NAMESPACE + +class QAccessibilityHintsPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QAccessibilityHints) +public: + void updateContrastPreference(Qt::ContrastPreference contrastPreference); + + static QAccessibilityHintsPrivate *get(QAccessibilityHints *q); +private: + Qt::ContrastPreference m_contrastPreference = Qt::ContrastPreference::NoPreference; +}; + +QT_END_NAMESPACE + +#endif // QACCESSIBILITYHINTS_P_H diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 3630537de26..3a494d6406a 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1589,8 +1589,7 @@ void QGuiApplicationPrivate::createPlatformIntegration() Q_UNUSED(platformExplicitlySelected); init_platform(QLatin1StringView(platformName), platformPluginPath, platformThemeName, argc, argv); - if (const QPlatformTheme *theme = platformTheme()) - QStyleHintsPrivate::get(QGuiApplication::styleHints())->updateColorScheme(theme->colorScheme()); + QStyleHintsPrivate::get(QGuiApplication::styleHints())->update(platformTheme()); if (!icon.isEmpty()) forcedWindowIcon = QDir::isAbsolutePath(icon) ? QIcon(icon) : QIcon::fromTheme(icon); @@ -2820,10 +2819,7 @@ void QGuiApplicationPrivate::processThemeChanged(QWindowSystemInterfacePrivate:: void QGuiApplicationPrivate::handleThemeChanged() { - const auto newColorScheme = platformTheme() ? platformTheme()->colorScheme() - : Qt::ColorScheme::Unknown; - QStyleHintsPrivate::get(QGuiApplication::styleHints())->updateColorScheme(newColorScheme); - + QStyleHintsPrivate::get(QGuiApplication::styleHints())->update(platformTheme()); updatePalette(); QIconLoader::instance()->updateSystemTheme(); diff --git a/src/gui/kernel/qstylehints.cpp b/src/gui/kernel/qstylehints.cpp index 174aa10be23..677567865f1 100644 --- a/src/gui/kernel/qstylehints.cpp +++ b/src/gui/kernel/qstylehints.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qaccessibilityhints_p.h" #include <qstylehints.h> #include "qstylehints_p.h" #include <qpa/qplatformintegration.h> @@ -179,6 +180,22 @@ void QStyleHints::setColorScheme(Qt::ColorScheme scheme) /*! + \property QStyleHints::accessibility + \brief The application's accessibility hints. + + The accessibility hints encapsulates platform dependent accessibility settings + such as whether the user wishes the application to be in high contrast or not. + + \sa QAccessibilityHints + \since 6.10 +*/ +const QAccessibilityHints *QStyleHints::accessibility() const +{ + Q_D(const QStyleHints); + return d->accessibilityHints(); +} + +/*! Sets the \a mousePressAndHoldInterval. \internal \sa mousePressAndHoldInterval() @@ -705,6 +722,26 @@ void QStyleHintsPrivate::updateColorScheme(Qt::ColorScheme colorScheme) emit q->colorSchemeChanged(colorScheme); } +/*! + \internal + + Helper function that updates the style hints when the theme changes +*/ +void QStyleHintsPrivate::update(const QPlatformTheme *theme) +{ + Q_ASSERT(theme); + updateColorScheme(theme->colorScheme()); + QAccessibilityHintsPrivate::get(accessibilityHints())->updateContrastPreference(theme->contrastPreference()); +} + +QAccessibilityHints *QStyleHintsPrivate::accessibilityHints() const +{ + Q_Q(const QStyleHints); + if (!m_accessibilityHints) + const_cast<QStyleHintsPrivate *>(this)->m_accessibilityHints = new QAccessibilityHints(const_cast<QStyleHints*>(q)); + return m_accessibilityHints; +} + QStyleHintsPrivate *QStyleHintsPrivate::get(QStyleHints *q) { Q_ASSERT(q); diff --git a/src/gui/kernel/qstylehints.h b/src/gui/kernel/qstylehints.h index 0f68f544ac6..31b8eea6f6d 100644 --- a/src/gui/kernel/qstylehints.h +++ b/src/gui/kernel/qstylehints.h @@ -9,9 +9,9 @@ QT_BEGIN_NAMESPACE - class QPlatformIntegration; class QStyleHintsPrivate; +class QAccessibilityHints; class Q_GUI_EXPORT QStyleHints : public QObject { @@ -57,6 +57,7 @@ class Q_GUI_EXPORT QStyleHints : public QObject Q_PROPERTY(Qt::ColorScheme colorScheme READ colorScheme WRITE setColorScheme RESET unsetColorScheme NOTIFY colorSchemeChanged FINAL) Q_PROPERTY(bool menuSelectionWraps READ menuSelectionWraps STORED false CONSTANT FINAL REVISION(6, 10)) + Q_PROPERTY(const QAccessibilityHints* accessibility READ accessibility CONSTANT FINAL REVISION(6, 10)) public: void setMouseDoubleClickInterval(int mouseDoubleClickInterval); @@ -103,6 +104,7 @@ public: Qt::ColorScheme colorScheme() const; void setColorScheme(Qt::ColorScheme scheme); void unsetColorScheme() { setColorScheme(Qt::ColorScheme::Unknown); } + const QAccessibilityHints* accessibility() const; Q_SIGNALS: void cursorFlashTimeChanged(int cursorFlashTime); diff --git a/src/gui/kernel/qstylehints_p.h b/src/gui/kernel/qstylehints_p.h index 497bf95cbf4..e4949fbeee9 100644 --- a/src/gui/kernel/qstylehints_p.h +++ b/src/gui/kernel/qstylehints_p.h @@ -19,6 +19,7 @@ #include <QPalette> #include <private/qguiapplication_p.h> #include "qstylehints.h" +#include "qaccessibilityhints.h" QT_BEGIN_NAMESPACE @@ -43,11 +44,15 @@ public: Qt::ColorScheme colorScheme() const { return m_colorScheme; } void updateColorScheme(Qt::ColorScheme colorScheme); + void update(const QPlatformTheme *theme); + + QAccessibilityHints *accessibilityHints() const; static QStyleHintsPrivate *get(QStyleHints *q); private: Qt::ColorScheme m_colorScheme = Qt::ColorScheme::Unknown; + QAccessibilityHints* m_accessibilityHints = nullptr; }; QT_END_NAMESPACE |