aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2020-04-17 14:32:55 +0200
committerMitch Curtis <mitch.curtis@qt.io>2020-08-26 11:46:07 +0200
commit501bc44bb006ee8021cbaaa7a696e7c9263395d3 (patch)
tree6e266d07f3ef0b57dd19b4a7c505ed064ad01636 /src/imports
parent92879d8f6b8b840328813f29f758865a412af270 (diff)
Use qmlRegisterModuleImport() to register styles
This patch completes the cumulative work done in previous patches. - Uses qmlRegisterModuleImport() to register styles. This has some added requirements: - Each style must now be a QML module -- that is, it must have a qmldir file. - As a result of the above, the module must be available within the QML import path in order to be found. - The various forms of accepted style names have been reduced down to one ("Material", "MyStyle", etc). See below for an explanation of why. - The following API in QQuickStyle is removed: addStylePath(), availableStyles(), path(), stylePathList(). These no longer make sense now that we reuse the existing QML import system. - Adds the tst_qquickstyleselector auto test back as "styleimports". qmlRegisterModuleImport() vs resolvedUrl() Previously we would use QQuickStyleSelector to select individual QML files based on which style was set. We'd do this once when QtQuick.Controls was first imported. With Qt 6, and the requirement that each style be a proper QML module, qmlRegisterModuleImport() was introduced. This allows us to "link" one import with another. For an example of what this looks like in practice, suppose the style was set to "MyStyle", and the fallback to "Material". The "QtQuick.Controls" import will be linked to "MyStyle", "MyStyle" to "QtQuick.Controls.Material", and as a final fallback (for controls like Action which only the Default style implements), "QtQuick.Controls.Material" to "QtQuick.Controls.Default". This is the same behavior as in Qt 5 (see qquickstyleselector.cpp): // 1) requested style (e.g. "MyStyle", included in d->selectors) // 2) fallback style (e.g. "Material", included in d->selectors) // 3) default style (empty selector, not in d->selectors) This is a necessary step to enable compilation of QML to C++. Reducing the set of accepted style names The problem In QtQuickControls2Plugin() we need to call QQuickStylePrivate::init(baseUrl()) in order to detect if the style is a custom style in QQuickStyleSpec::resolve() (by checking if the style path starts with the base URL). In Qt 5, init() is called in QtQuickControls2Plugin::registerTypes(), but in Qt 6 that's too late, because we need to call qmlRegisterModuleImport() in the constructor. qmlRegisterModuleImport() itself requires the style to have already been set in order to create the correct import URI ("QtQuick.Controls.X" for built-in styles, "MyCustomStyle" for custom styles). The solution By reducing the valid forms for style names down to one: ./myapp -style MyStyle we solve the problem of needing baseUrl() to determine if the style is a custom style or not, but needing to call it too early (since we now call qmlRegisterModuleImport() in QtQuickControls2Plugin(), which itself requires the style to have already been set). baseUrl() can't have been set before the constructor is finished. All of the various forms for _setting_ a style are still valid; environment variables, qtquickcontrols2.conf, etc. [ChangeLog][Important Behavior Changes] Custom styles must now have a qmldir that lists the files that the style implements. For example, for a style that only implements Button: --- module MyStyle Button 1.0 Button.qml --- In addition, there is now only one valid, case-sensitive form for style names: "Material", "MyStyle", etc. These changes are done to help enable the compilation of QML code to C++, as well as improve tooling capabilities. [ChangeLog][Important Behavior Changes] The following API was removed: - QQuickStyle::addStylePath() - QQuickStyle::availableStyles() - QQuickStyle::path() - QQuickStyle::stylePathList() - QT_QUICK_CONTROLS_STYLE_PATH This API is no longer necessary and/or able to be provided now that styles are treated as regular QML modules. Task-number: QTBUG-82922 Change-Id: I3b281131903c7c3c1cf0616eb7486a872dccd730 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/imports')
-rw-r--r--src/imports/controls/default/qtquickcontrols2defaultstyleplugin.cpp12
-rw-r--r--src/imports/controls/doc/src/qtquickcontrols2-customize.qdoc44
-rw-r--r--src/imports/controls/doc/src/qtquickcontrols2-environment.qdoc8
-rw-r--r--src/imports/controls/fusion/qmldir2
-rw-r--r--src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp18
-rw-r--r--src/imports/controls/imagine/qmldir2
-rw-r--r--src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp20
-rw-r--r--src/imports/controls/material/qmldir2
-rw-r--r--src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp17
-rw-r--r--src/imports/controls/qtquickcontrols2plugin.cpp160
-rw-r--r--src/imports/controls/universal/qmldir2
-rw-r--r--src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp18
12 files changed, 184 insertions, 121 deletions
diff --git a/src/imports/controls/default/qtquickcontrols2defaultstyleplugin.cpp b/src/imports/controls/default/qtquickcontrols2defaultstyleplugin.cpp
index 0ed33d12..a486658e 100644
--- a/src/imports/controls/default/qtquickcontrols2defaultstyleplugin.cpp
+++ b/src/imports/controls/default/qtquickcontrols2defaultstyleplugin.cpp
@@ -38,6 +38,7 @@
#include "qquickdefaulttheme_p.h"
#include <QtQuickControls2/private/qquickstyleplugin_p.h>
+#include <QtQuickTemplates2/private/qquicktheme_p.h>
QT_BEGIN_NAMESPACE
@@ -50,7 +51,10 @@ public:
QtQuickControls2DefaultStylePlugin(QObject *parent = nullptr);
QString name() const override;
- void initializeTheme(QQuickTheme *theme) override;
+
+ void registerTypes(const char *uri) override;
+
+ QQuickDefaultTheme theme;
};
QtQuickControls2DefaultStylePlugin::QtQuickControls2DefaultStylePlugin(QObject *parent) : QQuickStylePlugin(parent)
@@ -62,9 +66,11 @@ QString QtQuickControls2DefaultStylePlugin::name() const
return QStringLiteral("Default");
}
-void QtQuickControls2DefaultStylePlugin::initializeTheme(QQuickTheme *theme)
+void QtQuickControls2DefaultStylePlugin::registerTypes(const char *uri)
{
- QQuickDefaultTheme::initialize(theme);
+ QQuickStylePlugin::registerTypes(uri);
+
+ theme.initialize(QQuickTheme::instance());
}
QT_END_NAMESPACE
diff --git a/src/imports/controls/doc/src/qtquickcontrols2-customize.qdoc b/src/imports/controls/doc/src/qtquickcontrols2-customize.qdoc
index 6ab649d0..58138a07 100644
--- a/src/imports/controls/doc/src/qtquickcontrols2-customize.qdoc
+++ b/src/imports/controls/doc/src/qtquickcontrols2-customize.qdoc
@@ -112,7 +112,7 @@
\section2 Definition of a Style
In Qt Quick Controls, a style is essentially an interchangeable set of
- QML files within a single directory. There are three requirements for a style
+ QML files within a single directory. There are four requirements for a style
to be \l {Using Styles in Qt Quick Controls}{usable}:
\list
@@ -125,21 +125,37 @@
If we instead used the corresponding type from the \l {Qt Quick Controls}
{QtQuick.Controls} import as we did in the previous section, it would not work:
the control we were defining would try to derive from itself.
- \li The files must be in a directory in the filesystem or in the
- \l {The Qt Resource System}{resource system}.
+ \li A \l {Module Definition qmldir Files}{qmldir} file must exist alongside
+ the QML file(s). Below is an example of a simple \c qmldir file for a style that
+ provides a button:
- For example, these are all valid paths to a style:
+ \badcode
+ module MyStyle
+ Button 2.15 Button.qml
+ \endcode
+
+ The directory structure for such a style looks like this:
+
+ \badcode
+ MyStyle
+ ├─── Button.qml
+ └─── qmldir
+ \endcode
+ \li The files must be in a directory that is findable via the \l {QML Import Path}.
+
+ For example, if the path to \e MyStyle directory mentioned above was
+ \c /home/user/MyApp/MyStyle, then \c /home/user/MyApp must be added to
+ the QML import path.
+
+ To \l {Using Styles in Qt Quick Controls}{use} \e MyStyle in \e MyApp,
+ refer to it by name:
\list
- \li \c {./myapp -style /home/absolute/path/to/my/style}
- \li \c {./myapp -style :/mystyle}
- \li \c {./myapp -style relative/path/to/my/style}
- \li \c {./myapp -style MyStyle}
+ \li \c {./MyApp -style MyStyle}
\endlist
- The third and fourth paths will be looked up within the QML engine's import path
- list. This is the same as what happens when you pass \c Material as the style,
- for example.
+ The style name must match the casing of the style directory; passing
+ \e mystyle or \e MYSTYLE is not supported.
\endlist
By default, the styling system uses the Default style as a fallback for
@@ -302,7 +318,7 @@
style will illustrate the elevation with a drop shadow; the higher the
elevation, the larger the shadow.
- The first step is to \l {Qt Creator: Creating Qt Quick Projects}{create a new Qt Quick
+ The first step is to \l {Creating Qt Quick Projects}{create a new Qt Quick
Controls 2 application} in Qt Creator. After that, we
\l {Qt Creator: Creating C++ Classes}{add a C++ type} that stores the elevation. Since
the type will be used for every control supported by our style, and because
@@ -390,6 +406,8 @@
qmlRegisterUncreatableType<MyStyle>("MyStyle", 1, 0, "MyStyle", "MyStyle is an attached property");
QQmlApplicationEngine engine;
+ // Make the directory containing our style known to the QML engine.
+ engine.addImportPath(":/");
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
return app.exec();
@@ -465,7 +483,7 @@
One button has no elevation, and the other has an elevation of \c 10.
With that in place, we can run our example. To tell the application to
- use our new style, we pass \c {-style :/mystyle} as an application
+ use our new style, we pass \c {-style MyStyle} as an application
argument, but there are \l {Using Styles in Qt Quick Controls}{many
ways} to specify the style to use.
diff --git a/src/imports/controls/doc/src/qtquickcontrols2-environment.qdoc b/src/imports/controls/doc/src/qtquickcontrols2-environment.qdoc
index e1461ee4..4484acf3 100644
--- a/src/imports/controls/doc/src/qtquickcontrols2-environment.qdoc
+++ b/src/imports/controls/doc/src/qtquickcontrols2-environment.qdoc
@@ -41,18 +41,12 @@
\li \c QT_QUICK_CONTROLS_STYLE
\li Specifies the default \l {Styling Qt Quick Controls}{Qt Quick Controls style}.
The value can be either one of the built-in styles, for example \c "Material",
- or the path to a custom style such as \c ":/mystyle".
+ or a custom style such as \c "MyStyle".
\row
\li \c QT_QUICK_CONTROLS_FALLBACK_STYLE
\li Specifies a fallback style for \l {Creating a Custom Style}{custom styles}.
The value can be one of the built-in styles, for example \c "Material",
\row
- \li \c QT_QUICK_CONTROLS_STYLE_PATH
- \li Specifies a list of additional paths that are used to lookup \l {Styling Qt Quick Controls}
- {Qt Quick Controls styles}. Multiple path entries must be \l {QDir::listSeparator}{separated}
- by \c ':' under Unix and \c ';' under Windows. By default, styles are looked up from
- \c $QML2_IMPORT_PATH/QtQuick/Controls.
- \row
\li \c QT_QUICK_CONTROLS_CONF
\li Specifies the location of the \l {Qt Quick Controls configuration file}.
By default, the configuration file is loaded from the application's
diff --git a/src/imports/controls/fusion/qmldir b/src/imports/controls/fusion/qmldir
index 572a6dd2..84c0b211 100644
--- a/src/imports/controls/fusion/qmldir
+++ b/src/imports/controls/fusion/qmldir
@@ -1,7 +1,7 @@
module QtQuick.Controls.Fusion
plugin qtquickcontrols2fusionstyleplugin
classname QtQuickControls2FusionStylePlugin
-depends QtQuick.Controls 2.5
+import QtQuick.Controls.Default auto
# QtQuick.Controls 2.0 (originally introduced in Qt 5.7)
ApplicationWindow 2.0 ApplicationWindow.qml
diff --git a/src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp b/src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp
index b9df2e7d..c70c9602 100644
--- a/src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp
+++ b/src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp
@@ -34,12 +34,13 @@
**
****************************************************************************/
-#include <QtQuickControls2/private/qquickstyleplugin_p.h>
-#include <QtQml/qqml.h>
-
#include "qquickfusionstyle_p.h"
#include "qquickfusiontheme_p.h"
+#include <QtQml/qqml.h>
+#include <QtQuickControls2/private/qquickstyleplugin_p.h>
+#include <QtQuickTemplates2/private/qquicktheme_p.h>
+
QT_BEGIN_NAMESPACE
class QtQuickControls2FusionStylePlugin : public QQuickStylePlugin
@@ -51,7 +52,10 @@ public:
QtQuickControls2FusionStylePlugin(QObject *parent = nullptr);
QString name() const override;
- void initializeTheme(QQuickTheme *theme) override;
+
+ void registerTypes(const char *uri) override;
+
+ QQuickFusionTheme theme;
};
QtQuickControls2FusionStylePlugin::QtQuickControls2FusionStylePlugin(QObject *parent) : QQuickStylePlugin(parent)
@@ -63,9 +67,11 @@ QString QtQuickControls2FusionStylePlugin::name() const
return QStringLiteral("Fusion");
}
-void QtQuickControls2FusionStylePlugin::initializeTheme(QQuickTheme *theme)
+void QtQuickControls2FusionStylePlugin::registerTypes(const char *uri)
{
- QQuickFusionTheme::initialize(theme);
+ QQuickStylePlugin::registerTypes(uri);
+
+ theme.initialize(QQuickTheme::instance());
}
QT_END_NAMESPACE
diff --git a/src/imports/controls/imagine/qmldir b/src/imports/controls/imagine/qmldir
index 380a0dc3..e3d7d8d5 100644
--- a/src/imports/controls/imagine/qmldir
+++ b/src/imports/controls/imagine/qmldir
@@ -1,7 +1,7 @@
module QtQuick.Controls.Imagine
plugin qtquickcontrols2imaginestyleplugin
classname QtQuickControls2ImagineStylePlugin
-depends QtQuick.Controls 2.5
+import QtQuick.Controls.Default auto
# QtQuick.Controls 2.0 (originally introduced in Qt 5.7)
ApplicationWindow 2.0 ApplicationWindow.qml
diff --git a/src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp b/src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp
index d59cf555..0c864254 100644
--- a/src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp
+++ b/src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp
@@ -34,13 +34,14 @@
**
****************************************************************************/
-#include <QtQuickControls2/private/qquickstyleplugin_p.h>
-#include <QtCore/qloggingcategory.h>
-#include <QtQml/qqml.h>
-
#include "qquickimaginestyle_p.h"
#include "qquickimaginetheme_p.h"
+#include <QtCore/qloggingcategory.h>
+#include <QtQml/qqml.h>
+#include <QtQuickControls2/private/qquickstyleplugin_p.h>
+#include <QtQuickTemplates2/private/qquicktheme_p.h>
+
QT_BEGIN_NAMESPACE
class QtQuickControls2ImagineStylePlugin : public QQuickStylePlugin
@@ -52,7 +53,10 @@ public:
QtQuickControls2ImagineStylePlugin(QObject *parent = nullptr);
QString name() const override;
- void initializeTheme(QQuickTheme *theme) override;
+
+ void registerTypes(const char *uri) override;
+
+ QQuickImagineTheme theme;
};
QtQuickControls2ImagineStylePlugin::QtQuickControls2ImagineStylePlugin(QObject *parent) : QQuickStylePlugin(parent)
@@ -64,9 +68,11 @@ QString QtQuickControls2ImagineStylePlugin::name() const
return QStringLiteral("Imagine");
}
-void QtQuickControls2ImagineStylePlugin::initializeTheme(QQuickTheme *theme)
+void QtQuickControls2ImagineStylePlugin::registerTypes(const char *uri)
{
- QQuickImagineTheme::initialize(theme);
+ QQuickStylePlugin::registerTypes(uri);
+
+ theme.initialize(QQuickTheme::instance());
}
QT_END_NAMESPACE
diff --git a/src/imports/controls/material/qmldir b/src/imports/controls/material/qmldir
index a1064229..39dae48a 100644
--- a/src/imports/controls/material/qmldir
+++ b/src/imports/controls/material/qmldir
@@ -1,7 +1,7 @@
module QtQuick.Controls.Material
plugin qtquickcontrols2materialstyleplugin
classname QtQuickControls2MaterialStylePlugin
-depends QtQuick.Controls 2.5
+import QtQuick.Controls.Default auto
# QtQuick.Controls 2.0 (originally introduced in Qt 5.7)
ApplicationWindow 2.0 ApplicationWindow.qml
diff --git a/src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp b/src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp
index dc6873bb..6066d3f5 100644
--- a/src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp
+++ b/src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp
@@ -34,12 +34,12 @@
**
****************************************************************************/
-#include <QtQuickControls2/private/qquickstyleplugin_p.h>
-
#include "qquickmaterialstyle_p.h"
#include "qquickmaterialtheme_p.h"
+#include <QtQuickControls2/private/qquickstyleplugin_p.h>
#include <QtQuickControls2Impl/private/qquickpaddedrectangle_p.h>
+#include <QtQuickTemplates2/private/qquicktheme_p.h>
QT_BEGIN_NAMESPACE
@@ -52,12 +52,14 @@ public:
QtQuickControls2MaterialStylePlugin(QObject *parent = nullptr);
QString name() const override;
- void initializeTheme(QQuickTheme *theme) override;
+
+ void registerTypes(const char *uri) override;
+
+ QQuickMaterialTheme theme;
};
QtQuickControls2MaterialStylePlugin::QtQuickControls2MaterialStylePlugin(QObject *parent) : QQuickStylePlugin(parent)
{
- QQuickMaterialStyle::initGlobals();
}
QString QtQuickControls2MaterialStylePlugin::name() const
@@ -65,9 +67,12 @@ QString QtQuickControls2MaterialStylePlugin::name() const
return QStringLiteral("Material");
}
-void QtQuickControls2MaterialStylePlugin::initializeTheme(QQuickTheme *theme)
+void QtQuickControls2MaterialStylePlugin::registerTypes(const char *uri)
{
- QQuickMaterialTheme::initialize(theme);
+ QQuickStylePlugin::registerTypes(uri);
+
+ QQuickMaterialStyle::initGlobals();
+ theme.initialize(QQuickTheme::instance());
}
QT_END_NAMESPACE
diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp
index 17eb2be9..ef642905 100644
--- a/src/imports/controls/qtquickcontrols2plugin.cpp
+++ b/src/imports/controls/qtquickcontrols2plugin.cpp
@@ -37,6 +37,7 @@
#include <QtCore/qdir.h>
#include <QtCore/qfile.h>
#include <QtCore/qfileinfo.h>
+#include <QtCore/qloggingcategory.h>
#include <QtCore/qpluginloader.h>
#include <QtCore/private/qfileselector_p.h>
#include <QtQml/qqmlfile.h>
@@ -50,6 +51,8 @@
QT_BEGIN_NAMESPACE
+Q_LOGGING_CATEGORY(lcQtQuickControlsStylePlugin, "qt.quick.controls.qtquickcontrols2plugin")
+
class QtQuickControls2Plugin : public QQmlExtensionPlugin
{
Q_OBJECT
@@ -59,17 +62,41 @@ public:
QtQuickControls2Plugin(QObject *parent = nullptr);
~QtQuickControls2Plugin();
- void initializeEngine(QQmlEngine *engine, const char *uri) override;
void registerTypes(const char *uri) override;
void unregisterTypes() override;
private:
- void init();
-
- QList<QQuickStylePlugin *> loadStylePlugins();
QQuickTheme *createTheme(const QString &name);
+
+ bool registeredFallbackImport = false;
};
+static const char *qtQuickControlsUri = "QtQuick.Controls";
+
+QString styleUri()
+{
+ const QString style = QQuickStyle::name();
+ if (!QQuickStylePrivate::isCustomStyle()) {
+ // The style set is a built-in style.
+ const QString styleName = QQuickStylePrivate::effectiveStyleName(style);
+ return QString::fromLatin1("QtQuick.Controls.%1").arg(styleName);
+ }
+
+ // This is a custom style, so just use the name as the import uri.
+ QString styleName = style;
+ if (styleName.startsWith(QLatin1String(":/")))
+ styleName.remove(0, 2);
+ return styleName;
+}
+
+QString fallbackStyleUri()
+{
+ // The fallback style must be a built-in style, so we don't need to check for custom styles here.
+ const QString fallbackStyle = QQuickStylePrivate::fallbackStyle();
+ const QString fallbackStyleName = QQuickStylePrivate::effectiveStyleName(fallbackStyle);
+ return QString::fromLatin1("QtQuick.Controls.%1").arg(fallbackStyleName);
+}
+
QtQuickControls2Plugin::QtQuickControls2Plugin(QObject *parent) : QQmlExtensionPlugin(parent)
{
}
@@ -80,88 +107,83 @@ QtQuickControls2Plugin::~QtQuickControls2Plugin()
// initialization and cleanup, as plugins are not unloaded on macOS.
}
-void QtQuickControls2Plugin::initializeEngine(QQmlEngine *engine, const char */*uri*/)
+void QtQuickControls2Plugin::registerTypes(const char *uri)
{
- engine->addUrlInterceptor(&QQuickStylePrivate::urlInterceptor);
- init();
-}
+ qCDebug(lcQtQuickControlsStylePlugin) << "registerTypes() called with uri" << uri;
+
+ // It's OK that the style is resolved more than once; some accessors like name() cause it to be called, for example.
+ QQuickStylePrivate::init();
+
+ const QString styleName = QQuickStylePrivate::effectiveStyleName(QQuickStyle::name());
+ const QString fallbackStyleName = QQuickStylePrivate::effectiveStyleName(QQuickStylePrivate::fallbackStyle());
+ qCDebug(lcQtQuickControlsStylePlugin) << "style:" << QQuickStyle::name() << "effective style:" << styleName
+ << "fallback style:" << QQuickStylePrivate::fallbackStyle() << "effective fallback style:" << fallbackStyleName;
+
+ createTheme(styleName);
+
+ // If the style is Default, we don't need to register the fallback because the Default style
+ // provides all controls. Also, if we didn't return early here, we can get an infinite import loop
+ // when the style is set to Default.
+ if (styleName != fallbackStyleName && styleName != QLatin1String("Default")) {
+ const QString fallbackstyleUri = ::fallbackStyleUri();
+ qCDebug(lcQtQuickControlsStylePlugin) << "calling qmlRegisterModuleImport() to register fallback style with"
+ << "uri \"" << qtQuickControlsUri << "\" moduleMajor" << QQmlModuleImportModuleAny << "import" << fallbackstyleUri
+ << "importMajor" << QQmlModuleImportAuto;
+ // The fallback style must be a built-in style, so we match the version number.
+ qmlRegisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, fallbackstyleUri.toUtf8().constData(),
+ QQmlModuleImportAuto, QQmlModuleImportAuto);
+ registeredFallbackImport = true;
+ }
-void QtQuickControls2Plugin::registerTypes(const char */*uri*/)
-{
- QQuickStylePrivate::init(baseUrl());
+ const QString styleUri = ::styleUri();
+ // If the user imports QtQuick.Controls 2.15, and they're using the Material style, we should import version 2.15.
+ // However, if they import QtQuick.Controls 2.15, but are using a custom style, we want to use the latest version
+ // number of their style.
+ const int importMajor = !QQuickStylePrivate::isCustomStyle() ? QQmlModuleImportAuto : QQmlModuleImportLatest;
+ qCDebug(lcQtQuickControlsStylePlugin).nospace() << "calling qmlRegisterModuleImport() to register primary style with"
+ << " uri \"" << qtQuickControlsUri << "\" moduleMajor " << importMajor << " import " << styleUri
+ << " importMajor " << importMajor;
+ qmlRegisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, styleUri.toUtf8().constData(), importMajor);
const QString style = QQuickStyle::name();
if (!style.isEmpty())
- QFileSelectorPrivate::addStatics(QStringList() << style.toLower());
+ QFileSelectorPrivate::addStatics(QStringList() << style);
}
void QtQuickControls2Plugin::unregisterTypes()
{
+ qCDebug(lcQtQuickControlsStylePlugin) << "unregisterTypes() called";
+
+ if (registeredFallbackImport) {
+ const QString fallbackStyleUri = ::fallbackStyleUri();
+ qmlUnregisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, fallbackStyleUri.toUtf8().constData(),
+ QQmlModuleImportAuto, QQmlModuleImportAuto);
+ }
+
+ const QString primary = QQuickStylePrivate::effectiveStyleName(QQuickStyle::name());
+ const QString styleUri = ::styleUri();
+ const int importMajor = !QQuickStylePrivate::isCustomStyle() ? QQmlModuleImportAuto : QQmlModuleImportLatest;
+ qmlUnregisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, styleUri.toUtf8().constData(), importMajor);
+
QQuickStylePrivate::reset();
}
-void QtQuickControls2Plugin::init()
-{
- const QString style = QQuickStyle::name();
- QQuickTheme *theme = createTheme(style.isEmpty() ? QLatin1String("Default") : style);
+/*!
+ \internal
- // load the style's plugins to get access to its resources and initialize the theme
- QList<QQuickStylePlugin *> stylePlugins = loadStylePlugins();
- for (QQuickStylePlugin *stylePlugin : stylePlugins)
- stylePlugin->initializeTheme(theme);
- qDeleteAll(stylePlugins);
-}
+ Responsible for setting the font and palette settings that were specified in the
+ qtquickcontrols2.conf file.
-QList<QQuickStylePlugin *> QtQuickControls2Plugin::loadStylePlugins()
-{
- QList<QQuickStylePlugin *> stylePlugins;
-
- QFileInfo fileInfo = QQmlFile::urlToLocalFileOrQrc(resolvedUrl(QStringLiteral("qmldir")));
- if (fileInfo.exists() && fileInfo.path() != QQmlFile::urlToLocalFileOrQrc(baseUrl())) {
- QFile file(fileInfo.filePath());
- if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QQmlDirParser parser;
- parser.parse(QString::fromUtf8(file.readAll()));
- if (!parser.hasError()) {
-#ifdef QT_STATIC
- const auto plugins = QPluginLoader::staticInstances();
- for (QObject *instance : plugins) {
- QQuickStylePlugin *stylePlugin = qobject_cast<QQuickStylePlugin *>(instance);
- if (!stylePlugin || !parser.classNames().contains(QLatin1String(instance->metaObject()->className())))
- continue;
- stylePlugins += stylePlugin;
- }
-#elif QT_CONFIG(library)
- QPluginLoader loader;
- const auto plugins = parser.plugins();
- for (const QQmlDirParser::Plugin &plugin : plugins) {
- QDir dir = fileInfo.dir();
- if (!plugin.path.isEmpty() && !dir.cd(plugin.path))
- continue;
- QString filePath = dir.filePath(plugin.name);
-#if defined(Q_OS_MACOS) && defined(QT_DEBUG)
- // Avoid mismatching plugins on macOS so that we don't end up loading both debug and
- // release versions of the same Qt libraries (due to the plugin's dependencies).
- filePath += QStringLiteral("_debug");
-#endif // Q_OS_MACOS && QT_DEBUG
-#if defined(Q_OS_WIN) && defined(QT_DEBUG)
- // Debug versions of plugins have a "d" prefix on Windows.
- filePath += QLatin1Char('d');
-#endif // Q_OS_WIN && QT_DEBUG
- loader.setFileName(filePath);
- QQuickStylePlugin *stylePlugin = qobject_cast<QQuickStylePlugin *>(loader.instance());
- if (stylePlugin)
- stylePlugins += stylePlugin;
- }
-#endif
- }
- }
- }
- return stylePlugins;
-}
+ Style-specific settings (e.g. Variant=Dense) are read in the constructor of the
+ appropriate style plugin (e.g. QtQuickControls2MaterialStylePlugin).
+ Implicit style-specific font and palette values are assigned in the relevant theme
+ (e.g. QQuickMaterialTheme).
+*/
QQuickTheme *QtQuickControls2Plugin::createTheme(const QString &name)
{
+ qCDebug(lcQtQuickControlsStylePlugin) << "creating QQuickTheme instance to be initialized by style-specific theme of" << name;
+
QQuickTheme *theme = new QQuickTheme;
#if QT_CONFIG(settings)
QQuickThemePrivate *p = QQuickThemePrivate::get(theme);
diff --git a/src/imports/controls/universal/qmldir b/src/imports/controls/universal/qmldir
index 28bd5706..e2faf020 100644
--- a/src/imports/controls/universal/qmldir
+++ b/src/imports/controls/universal/qmldir
@@ -1,7 +1,7 @@
module QtQuick.Controls.Universal
plugin qtquickcontrols2universalstyleplugin
classname QtQuickControls2UniversalStylePlugin
-depends QtQuick.Controls 2.5
+import QtQuick.Controls.Default auto
# QtQuick.Controls 2.0 (originally introduced in Qt 5.7)
ApplicationWindow 2.0 ApplicationWindow.qml
diff --git a/src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp b/src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp
index ac154911..d6f7746d 100644
--- a/src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp
+++ b/src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp
@@ -34,11 +34,12 @@
**
****************************************************************************/
-#include <QtQuickControls2/private/qquickstyleplugin_p.h>
-
#include "qquickuniversalstyle_p.h"
#include "qquickuniversaltheme_p.h"
+#include <QtQuickControls2/private/qquickstyleplugin_p.h>
+#include <QtQuickTemplates2/private/qquicktheme_p.h>
+
QT_BEGIN_NAMESPACE
class QtQuickControls2UniversalStylePlugin : public QQuickStylePlugin
@@ -50,12 +51,14 @@ public:
QtQuickControls2UniversalStylePlugin(QObject *parent = nullptr);
QString name() const override;
- void initializeTheme(QQuickTheme *theme) override;
+
+ void registerTypes(const char *uri) override;
+
+ QQuickUniversalTheme theme;
};
QtQuickControls2UniversalStylePlugin::QtQuickControls2UniversalStylePlugin(QObject *parent) : QQuickStylePlugin(parent)
{
- QQuickUniversalStyle::initGlobals();
}
QString QtQuickControls2UniversalStylePlugin::name() const
@@ -63,9 +66,12 @@ QString QtQuickControls2UniversalStylePlugin::name() const
return QStringLiteral("Universal");
}
-void QtQuickControls2UniversalStylePlugin::initializeTheme(QQuickTheme *theme)
+void QtQuickControls2UniversalStylePlugin::registerTypes(const char *uri)
{
- QQuickUniversalTheme::initialize(theme);
+ QQuickStylePlugin::registerTypes(uri);
+
+ QQuickUniversalStyle::initGlobals();
+ theme.initialize(QQuickTheme::instance());
}
QT_END_NAMESPACE