diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2018-05-04 15:51:53 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2018-05-13 13:11:56 +0000 |
commit | 6077e77352add46c2f185d724c2c91946ef0b05d (patch) | |
tree | 8b19ffea37a56c49f8eceb42c27e9704ff7b2203 /src/imports | |
parent | d2897a6c85d46d41ea531ac66345cfdec230e7c9 (diff) |
Add Qt Quick Compiler support for external styles
Qt Quick Controls 2 selects its style when the main QtQuick.Controls
plugin is loaded. The style selection procedure resolves styled QML
files, such as Button.qml and Slider.qml, from the requested style.
The problem was that external styles were not able to embed styled
QML files into resources, because the external style plugin had not
yet been loaded when the style selection was performed. Only after
Button.qml & friends had been registered, and an instance was created,
those types would import the style (e.g. QtQuick.Controls.Material).
This patch solves the problem by manually loading the external style
plugin from the main Qt Quick Controls 2 plugin, in order to gain
access to its styled QML files in the resources. The name of the
style plugin is read from the qmldir file.
Change-Id: I5095ca129e909fb48fd106c87946a6ab9ae88931
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/imports')
-rw-r--r-- | src/imports/controls/fusion/fusion.pro | 2 | ||||
-rw-r--r-- | src/imports/controls/imagine/imagine.pro | 2 | ||||
-rw-r--r-- | src/imports/controls/material/material.pro | 3 | ||||
-rw-r--r-- | src/imports/controls/qtquickcontrols2plugin.cpp | 52 | ||||
-rw-r--r-- | src/imports/controls/universal/universal.pro | 3 |
5 files changed, 56 insertions, 6 deletions
diff --git a/src/imports/controls/fusion/fusion.pro b/src/imports/controls/fusion/fusion.pro index 705157b7..4bc9fcc1 100644 --- a/src/imports/controls/fusion/fusion.pro +++ b/src/imports/controls/fusion/fusion.pro @@ -19,7 +19,7 @@ SOURCES += \ RESOURCES += \ $$PWD/qtquickcontrols2fusionstyle.qrc -CONFIG += no_cxx_module +CONFIG += no_cxx_module install_qml_files builtin_resources qtquickcompiler load(qml_plugin) requires(qtConfig(quickcontrols2-fusion)) diff --git a/src/imports/controls/imagine/imagine.pro b/src/imports/controls/imagine/imagine.pro index 10582543..2368c0a4 100644 --- a/src/imports/controls/imagine/imagine.pro +++ b/src/imports/controls/imagine/imagine.pro @@ -22,7 +22,7 @@ qtquickcontrols2imaginestyle.files += \ $$files($$PWD/images/*.webp) RESOURCES += qtquickcontrols2imaginestyle -CONFIG += no_cxx_module +CONFIG += no_cxx_module install_qml_files builtin_resources qtquickcompiler load(qml_plugin) requires(qtConfig(quickcontrols2-imagine)) diff --git a/src/imports/controls/material/material.pro b/src/imports/controls/material/material.pro index c66cdb92..c3cbb355 100644 --- a/src/imports/controls/material/material.pro +++ b/src/imports/controls/material/material.pro @@ -19,8 +19,7 @@ SOURCES += \ RESOURCES += \ $$PWD/qtquickcontrols2materialstyleplugin.qrc -!static: CONFIG += qmlcache -CONFIG += no_cxx_module +CONFIG += no_cxx_module install_qml_files builtin_resources qtquickcompiler load(qml_plugin) requires(qtConfig(quickcontrols2-material)) diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp index 33e3cb32..e1b683e8 100644 --- a/src/imports/controls/qtquickcontrols2plugin.cpp +++ b/src/imports/controls/qtquickcontrols2plugin.cpp @@ -34,7 +34,14 @@ ** ****************************************************************************/ +#include <QtCore/qdir.h> +#include <QtCore/qfile.h> +#include <QtCore/qfileinfo.h> +#if !defined(QT_STATIC) && QT_CONFIG(library) +#include <QtCore/qlibrary.h> +#endif #include <QtCore/private/qfileselector_p.h> +#include <QtQml/private/qqmldirparser_p.h> #include <QtQuickControls2/qquickstyle.h> #include <QtQuickControls2/private/qquickchecklabel_p.h> #include <QtQuickControls2/private/qquickcolor_p.h> @@ -74,6 +81,11 @@ public: QString name() const override; QQuickTheme *createTheme() const override; + +#if !defined(QT_STATIC) && QT_CONFIG(library) +private: + void loadStylePlugin(); +#endif }; QtQuickControls2Plugin::QtQuickControls2Plugin(QObject *parent) : QQuickStylePlugin(parent) @@ -102,6 +114,11 @@ void QtQuickControls2Plugin::registerTypes(const char *uri) if (!style.isEmpty()) QFileSelectorPrivate::addStatics(QStringList() << style.toLower()); +#if !defined(QT_STATIC) && QT_CONFIG(library) + // load the style's plugin to get access to its resources + loadStylePlugin(); +#endif + qmlRegisterModule(uri, 2, QT_VERSION_MINOR - 7); // Qt 5.7->2.0, 5.8->2.1, 5.9->2.2... // QtQuick.Controls 2.0 (originally introduced in Qt 5.7) @@ -217,6 +234,41 @@ QQuickTheme *QtQuickControls2Plugin::createTheme() const return new QQuickDefaultTheme; } +#if !defined(QT_STATIC) && QT_CONFIG(library) +void QtQuickControls2Plugin::loadStylePlugin() +{ + QFileInfo fileInfo = resolvedUrl(QStringLiteral("qmldir")).toLocalFile(); + if (!fileInfo.exists() || fileInfo.path() == baseUrl().toLocalFile()) + return; + + QFile file(fileInfo.filePath()); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + return; + + QQmlDirParser parser; + parser.parse(QString::fromUtf8(file.readAll())); + if (parser.hasError()) + return; + + QLibrary lib; + lib.setLoadHints(QLibrary::PreventUnloadHint); + 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 + lib.setFileName(filePath); + lib.load(); + } +} +#endif // !QT_STATIC && QT_CONFIG(library) + QT_END_NAMESPACE #include "qtquickcontrols2plugin.moc" diff --git a/src/imports/controls/universal/universal.pro b/src/imports/controls/universal/universal.pro index bce86bac..399de032 100644 --- a/src/imports/controls/universal/universal.pro +++ b/src/imports/controls/universal/universal.pro @@ -19,8 +19,7 @@ SOURCES += \ RESOURCES += \ $$PWD/qtquickcontrols2universalstyleplugin.qrc -!static: CONFIG += qmlcache -CONFIG += no_cxx_module +CONFIG += no_cxx_module install_qml_files builtin_resources qtquickcompiler load(qml_plugin) requires(qtConfig(quickcontrols2-universal)) |