From cd4467753105e69b967d3aad8e6d890609dc830b Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 1 Dec 2015 18:05:05 +0100 Subject: QQuickStyleSelector: don't inherit QObject Fixes the "QObject: Cannot create children for a parent that is in a different thread." -warnings. Change-Id: I94ed34c6c4c7a6b6507e91e74a354630b0ad6d04 Reviewed-by: Liang Qi --- src/controls/qquickstyleselector.cpp | 24 ++++++++-------------- src/controls/qquickstyleselector_p.h | 13 ++++++------ src/controls/qquickstyleselector_p_p.h | 5 ++--- .../material/qtlabsmaterialstyleplugin.cpp | 2 +- src/imports/controls/qtlabscontrolsplugin.cpp | 2 +- .../universal/qtlabsuniversalstyleplugin.cpp | 2 +- 6 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/controls/qquickstyleselector.cpp b/src/controls/qquickstyleselector.cpp index d72de632..a84645d2 100644 --- a/src/controls/qquickstyleselector.cpp +++ b/src/controls/qquickstyleselector.cpp @@ -52,15 +52,12 @@ Q_GLOBAL_STATIC(QQuickStyleSelectorSharedData, sharedData); static QBasicMutex sharedDataMutex; QQuickStyleSelectorPrivate::QQuickStyleSelectorPrivate() - : QObjectPrivate() { } -QQuickStyleSelector::QQuickStyleSelector(QObject *parent) - : QObject(*(new QQuickStyleSelectorPrivate()), parent) +QQuickStyleSelector::QQuickStyleSelector() : d_ptr(new QQuickStyleSelectorPrivate) { Q_D(QQuickStyleSelector); - d->style = QGuiApplicationPrivate::styleOverride; if (d->style.isEmpty()) d->style = QString::fromLatin1(qgetenv("QT_LABS_CONTROLS_STYLE")); @@ -93,10 +90,10 @@ QUrl QQuickStyleSelector::select(const QUrl &filePath) const QUrl ret(filePath); if (isLocalScheme(filePath.scheme())) { QString equivalentPath = QLatin1Char(':') + filePath.path(); - QString selectedPath = d->select(equivalentPath); + QString selectedPath = d->select(equivalentPath, allSelectors()); ret.setPath(selectedPath.remove(0, 1)); } else { - ret = QUrl::fromLocalFile(d->select(ret.toLocalFile())); + ret = QUrl::fromLocalFile(d->select(ret.toLocalFile(), allSelectors())); } return ret; } @@ -127,16 +124,15 @@ static QString selectionHelper(const QString &path, const QString &fileName, con return path + fileName; } -QString QQuickStyleSelectorPrivate::select(const QString &filePath) const +QString QQuickStyleSelectorPrivate::select(const QString &filePath, const QStringList &allSelectors) const { - Q_Q(const QQuickStyleSelector); QFileInfo fi(filePath); // If file doesn't exist, don't select if (!fi.exists()) return filePath; QString ret = selectionHelper(fi.path().isEmpty() ? QString() : fi.path() + QLatin1Char('/'), - fi.fileName(), q->allSelectors()); + fi.fileName(), allSelectors); if (!ret.isEmpty()) return ret; @@ -176,12 +172,10 @@ QUrl QQuickStyleSelector::baseUrl() const return d->baseUrl; } -QQuickStyleSelector *QQuickStyleSelector::instance(QObject *parent) +QQuickStyleSelector *QQuickStyleSelector::instance() { - QPointer self; - if (!self) - self = new QQuickStyleSelector(parent); - return self; + static QQuickStyleSelector self; + return &self; } void QQuickStyleSelectorPrivate::updateSelectors() @@ -234,5 +228,3 @@ void QQuickStyleSelectorPrivate::addStatics(const QStringList &statics) } QT_END_NAMESPACE - -#include "moc_qquickstyleselector_p.cpp" diff --git a/src/controls/qquickstyleselector_p.h b/src/controls/qquickstyleselector_p.h index 567f592a..36ccf07c 100644 --- a/src/controls/qquickstyleselector_p.h +++ b/src/controls/qquickstyleselector_p.h @@ -46,17 +46,17 @@ // We mean it. // -#include -#include +#include +#include +#include QT_BEGIN_NAMESPACE class QQuickStyleSelectorPrivate; -class QQuickStyleSelector : public QObject +class QQuickStyleSelector { - Q_OBJECT public: - explicit QQuickStyleSelector(QObject *parent = Q_NULLPTR); + explicit QQuickStyleSelector(); ~QQuickStyleSelector(); QString select(const QString &filePath) const; @@ -69,12 +69,13 @@ public: void setBaseUrl(const QUrl &base); QUrl baseUrl() const; - static QQuickStyleSelector *instance(QObject *parent = Q_NULLPTR); + static QQuickStyleSelector *instance(); private: QUrl select(const QUrl &filePath) const; Q_DECLARE_PRIVATE(QQuickStyleSelector) + QScopedPointer d_ptr; }; QT_END_NAMESPACE diff --git a/src/controls/qquickstyleselector_p_p.h b/src/controls/qquickstyleselector_p_p.h index bf11fd1c..b0de326b 100644 --- a/src/controls/qquickstyleselector_p_p.h +++ b/src/controls/qquickstyleselector_p_p.h @@ -60,15 +60,14 @@ struct QQuickStyleSelectorSharedData //Not QSharedData because currently is just QStringList preloadedStatics; }; -class QQuickStyleSelectorPrivate : QObjectPrivate +class QQuickStyleSelectorPrivate { - Q_DECLARE_PUBLIC(QQuickStyleSelector) public: static void updateSelectors(); static QStringList platformSelectors(); static void addStatics(const QStringList &); //For loading GUI statics from other Qt modules QQuickStyleSelectorPrivate(); - QString select(const QString &filePath) const; + QString select(const QString &filePath, const QStringList &allSelectors) const; QString style; QUrl baseUrl; diff --git a/src/imports/controls/material/qtlabsmaterialstyleplugin.cpp b/src/imports/controls/material/qtlabsmaterialstyleplugin.cpp index e45d4bd2..ab98991a 100644 --- a/src/imports/controls/material/qtlabsmaterialstyleplugin.cpp +++ b/src/imports/controls/material/qtlabsmaterialstyleplugin.cpp @@ -85,7 +85,7 @@ void QtLabsMaterialStylePlugin::initializeEngine(QQmlEngine *engine, const char Q_UNUSED(engine); Q_UNUSED(uri); - QQuickStyleSelector *selector = QQuickStyleSelector::instance(this); + QQuickStyleSelector *selector = QQuickStyleSelector::instance(); if (selector && selector->style() == QStringLiteral("material")) { if (QFont(QStringLiteral("Roboto")).family() == QStringLiteral("Roboto")) { QPlatformTheme *old = QGuiApplicationPrivate::platform_theme; diff --git a/src/imports/controls/qtlabscontrolsplugin.cpp b/src/imports/controls/qtlabscontrolsplugin.cpp index 39525ee6..079d843d 100644 --- a/src/imports/controls/qtlabscontrolsplugin.cpp +++ b/src/imports/controls/qtlabscontrolsplugin.cpp @@ -64,7 +64,7 @@ void QtLabsControlsPlugin::registerTypes(const char *uri) qmlRegisterType(); // TODO: read the style from application manifest file - QQuickStyleSelector *selector = QQuickStyleSelector::instance(this); + QQuickStyleSelector *selector = QQuickStyleSelector::instance(); selector->setBaseUrl(baseUrl()); qmlRegisterType(selector->select(QStringLiteral("/ApplicationWindow.qml")), uri, 1, 0, "ApplicationWindow"); diff --git a/src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp b/src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp index e2d52f2f..2cf6fb67 100644 --- a/src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp +++ b/src/imports/controls/universal/qtlabsuniversalstyleplugin.cpp @@ -81,7 +81,7 @@ void QtLabsUniversalStylePlugin::registerTypes(const char *uri) void QtLabsUniversalStylePlugin::initializeEngine(QQmlEngine *engine, const char *uri) { - QQuickStyleSelector *selector = QQuickStyleSelector::instance(this); + QQuickStyleSelector *selector = QQuickStyleSelector::instance(); if (selector && selector->style() == QStringLiteral("universal")) { if (QFont(QStringLiteral("Segoe UI")).family() == QStringLiteral("Segoe UI")) { QPlatformTheme *old = QGuiApplicationPrivate::platform_theme; -- cgit v1.2.3