diff options
Diffstat (limited to 'src/quickcontrols2/qquickstyle.cpp')
-rw-r--r-- | src/quickcontrols2/qquickstyle.cpp | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/src/quickcontrols2/qquickstyle.cpp b/src/quickcontrols2/qquickstyle.cpp index 5eb85701..184cbfc7 100644 --- a/src/quickcontrols2/qquickstyle.cpp +++ b/src/quickcontrols2/qquickstyle.cpp @@ -174,6 +174,7 @@ struct QQuickStyleSpec style = QString::fromLatin1(qgetenv("QT_QUICK_CONTROLS_STYLE")); if (fallbackStyle.isEmpty()) setFallbackStyle(QString::fromLatin1(qgetenv("QT_QUICK_CONTROLS_FALLBACK_STYLE")), "QT_QUICK_CONTROLS_FALLBACK_STYLE"); +#if QT_CONFIG(settings) if (style.isEmpty() || fallbackStyle.isEmpty()) { QSharedPointer<QSettings> settings = QQuickStyleAttached::settings(QStringLiteral("Controls")); if (settings) { @@ -183,6 +184,7 @@ struct QQuickStyleSpec setFallbackStyle(settings->value(QStringLiteral("FallbackStyle")).toString(), ":/qtquickcontrols2.conf"); } } +#endif // resolve a path relative to the config QString configPath = QFileInfo(resolveConfigFilePath()).path(); @@ -205,12 +207,11 @@ struct QQuickStyleSpec if (QGuiApplication::instance()) { if (!custom) { - const QString targetPath = QStringLiteral("QtQuick/Controls.2"); - const QStringList importPaths = defaultImportPathList(); - - for (const QString &importPath : importPaths) { - QString stylePath = findStyle(importPath + QLatin1Char('/') + targetPath, style); + const QStringList stylePaths = QQuickStylePrivate::stylePaths(); + for (const QString &path : stylePaths) { + QString stylePath = findStyle(path, style); if (!stylePath.isEmpty()) { + custom = !stylePath.startsWith(baseUrl.toLocalFile()); style = stylePath; resolved = true; break; @@ -254,6 +255,27 @@ struct QQuickStyleSpec Q_GLOBAL_STATIC(QQuickStyleSpec, styleSpec) +QStringList QQuickStylePrivate::stylePaths() +{ + // system/custom style paths + QStringList paths; + if (Q_UNLIKELY(!qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE_PATH"))) { + const QByteArray value = qgetenv("QT_QUICK_CONTROLS_STYLE_PATH"); + paths += QString::fromLatin1(value).split(QDir::listSeparator(), QString::SkipEmptyParts); + } + + // built-in import paths + const QString targetPath = QStringLiteral("QtQuick/Controls.2"); + const QStringList importPaths = defaultImportPathList(); + for (const QString &importPath : importPaths) { + QDir dir(importPath); + if (dir.cd(targetPath)) + paths += dir.absolutePath(); + } + + return paths; +} + QString QQuickStylePrivate::fallbackStyle() { return styleSpec()->fallbackStyle; @@ -354,4 +376,29 @@ void QQuickStyle::setFallbackStyle(const QString &style) styleSpec()->setFallbackStyle(style, "QQuickStyle::setFallbackStyle()"); } +/*! + \since 5.9 + Returns the names of the available built-in styles. + + \note The method must be called \b after creating an instance of QGuiApplication. +*/ +QStringList QQuickStyle::availableStyles() +{ + QStringList styles; + if (!QGuiApplication::instance()) { + qWarning() << "ERROR: QQuickStyle::availableStyles() must be called after creating an instance of QGuiApplication."; + return styles; + } + + const QStringList stylePaths = QQuickStylePrivate::stylePaths(); + for (const QString &path : stylePaths) { + QDir dir(path); + styles += dir.entryList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot); + styles.removeAll(QStringLiteral("designer")); + } + styles.prepend(QStringLiteral("Default")); + styles.removeDuplicates(); + return styles; +} + QT_END_NAMESPACE |