From 9478053838ae2d950b162c2b93a2a400c82d9bf7 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Sun, 13 May 2018 19:34:29 +0200 Subject: Create and init QQuickTheme from QtQuickControls2Plugin Instead of creating and setting the QQuickTheme instance from each style plugin (e.g. QtQuickControls2MaterialStylePlugin), create the QQuickTheme instance in QtQuickControls2Plugin when the style is being resolved, and just pass the instance to be initialized by the style plugin(s). This avoids the problem that QQuickTheme API was virtual, and sub-classes created from plugins would have vtables destroyed before the QQuickTheme was destroyed. Task-number: QTBUG-67062 Task-number: QTBUG-68087 Change-Id: I19e9ced5296b708c2668c30163389cb3da6be7cf Reviewed-by: Mitch Curtis --- src/quickcontrols2/qquickstyleplugin.cpp | 52 ++------------------------------ src/quickcontrols2/qquickstyleplugin_p.h | 6 +--- 2 files changed, 3 insertions(+), 55 deletions(-) (limited to 'src/quickcontrols2') diff --git a/src/quickcontrols2/qquickstyleplugin.cpp b/src/quickcontrols2/qquickstyleplugin.cpp index c42ba88d..553a6cad 100644 --- a/src/quickcontrols2/qquickstyleplugin.cpp +++ b/src/quickcontrols2/qquickstyleplugin.cpp @@ -39,14 +39,11 @@ #include "qquickstyle_p.h" #include "qquickstyleselector_p.h" -#include - QT_BEGIN_NAMESPACE class QQuickStylePluginPrivate { public: - QQuickTheme *theme = nullptr; mutable QScopedPointer selector; }; @@ -57,51 +54,6 @@ QQuickStylePlugin::QQuickStylePlugin(QObject *parent) QQuickStylePlugin::~QQuickStylePlugin() { - Q_D(QQuickStylePlugin); - if (QQuickTheme::instance() == d->theme) - QQuickThemePrivate::instance.reset(); -} - -void QQuickStylePlugin::registerTypes(const char *uri) -{ - Q_UNUSED(uri); -} - -void QQuickStylePlugin::initializeEngine(QQmlEngine *engine, const char *uri) -{ - Q_D(QQuickStylePlugin); - Q_UNUSED(engine); - Q_UNUSED(uri); - - // make sure not to re-create the theme if initializeEngine() - // is called multiple times, like in case of qml2puppet (QTBUG-54995) - if (d->theme) - return; - - if (isCurrent()) { - d->theme = createTheme(); - if (d->theme) { -#if QT_CONFIG(settings) - QQuickThemePrivate *p = QQuickThemePrivate::get(d->theme); - QSharedPointer settings = QQuickStylePrivate::settings(name()); - if (settings) { - p->defaultFont.reset(QQuickStylePrivate::readFont(settings)); - p->defaultPalette.reset(QQuickStylePrivate::readPalette(settings)); - } -#endif - QQuickThemePrivate::instance.reset(d->theme); - } - } -} - -bool QQuickStylePlugin::isCurrent() const -{ - QString style = QQuickStyle::name(); - if (style.isEmpty()) - style = QStringLiteral("Default"); - - const QString theme = name(); - return theme.compare(style, Qt::CaseInsensitive) == 0; } QString QQuickStylePlugin::name() const @@ -109,9 +61,9 @@ QString QQuickStylePlugin::name() const return QString(); } -QQuickTheme *QQuickStylePlugin::createTheme() const +void QQuickStylePlugin::initializeTheme(QQuickTheme *theme) { - return nullptr; + Q_UNUSED(theme); } QUrl QQuickStylePlugin::resolvedUrl(const QString &fileName) const diff --git a/src/quickcontrols2/qquickstyleplugin_p.h b/src/quickcontrols2/qquickstyleplugin_p.h index 735341df..6b89926c 100644 --- a/src/quickcontrols2/qquickstyleplugin_p.h +++ b/src/quickcontrols2/qquickstyleplugin_p.h @@ -64,12 +64,8 @@ public: explicit QQuickStylePlugin(QObject *parent = nullptr); ~QQuickStylePlugin(); - void registerTypes(const char *uri) override; - void initializeEngine(QQmlEngine *engine, const char *uri) override; - - bool isCurrent() const; virtual QString name() const; - virtual QQuickTheme *createTheme() const; + virtual void initializeTheme(QQuickTheme *theme); QUrl resolvedUrl(const QString &fileName) const; -- cgit v1.2.3