aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2018-05-04 15:51:53 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2018-05-13 13:11:56 +0000
commit6077e77352add46c2f185d724c2c91946ef0b05d (patch)
tree8b19ffea37a56c49f8eceb42c27e9704ff7b2203 /src/imports
parentd2897a6c85d46d41ea531ac66345cfdec230e7c9 (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.pro2
-rw-r--r--src/imports/controls/imagine/imagine.pro2
-rw-r--r--src/imports/controls/material/material.pro3
-rw-r--r--src/imports/controls/qtquickcontrols2plugin.cpp52
-rw-r--r--src/imports/controls/universal/universal.pro3
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))