diff options
-rw-r--r-- | examples/quickcontrols2/gallery/gallery.cpp | 1 | ||||
-rw-r--r-- | examples/quickcontrols2/gallery/gallery.qml | 2 | ||||
-rw-r--r-- | src/quickcontrols2/qquickstyle.cpp | 47 | ||||
-rw-r--r-- | src/quickcontrols2/qquickstyle.h | 1 | ||||
-rw-r--r-- | src/quickcontrols2/qquickstyle_p.h | 1 | ||||
-rw-r--r-- | tests/auto/qquickstyle/tst_qquickstyle.cpp | 8 |
6 files changed, 54 insertions, 6 deletions
diff --git a/examples/quickcontrols2/gallery/gallery.cpp b/examples/quickcontrols2/gallery/gallery.cpp index 90b63cac..bfbdb49c 100644 --- a/examples/quickcontrols2/gallery/gallery.cpp +++ b/examples/quickcontrols2/gallery/gallery.cpp @@ -60,6 +60,7 @@ int main(int argc, char *argv[]) QQuickStyle::setStyle(settings.value("style").toString()); QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("availableStyles", QQuickStyle::availableStyles()); engine.load(QUrl("qrc:/gallery.qml")); if (engine.rootObjects().isEmpty()) return -1; diff --git a/examples/quickcontrols2/gallery/gallery.qml b/examples/quickcontrols2/gallery/gallery.qml index 89c0c607..c68765b5 100644 --- a/examples/quickcontrols2/gallery/gallery.qml +++ b/examples/quickcontrols2/gallery/gallery.qml @@ -256,7 +256,7 @@ ApplicationWindow { ComboBox { id: styleBox property int styleIndex: -1 - model: ["Default", "Material", "Universal"] + model: availableStyles Component.onCompleted: { styleIndex = find(settings.style, Qt.MatchFixedString) if (styleIndex !== -1) diff --git a/src/quickcontrols2/qquickstyle.cpp b/src/quickcontrols2/qquickstyle.cpp index f4fc1764..c8a3f19a 100644 --- a/src/quickcontrols2/qquickstyle.cpp +++ b/src/quickcontrols2/qquickstyle.cpp @@ -178,11 +178,9 @@ struct QQuickStyleSpec if (QGuiApplication::instance()) { if (!custom) { - const QString targetPath = QStringLiteral("QtQuick/Controls.2"); - const QStringList importPaths = QQmlEngine().importPathList(); - - 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()) { style = stylePath; resolved = true; @@ -212,6 +210,20 @@ struct QQuickStyleSpec Q_GLOBAL_STATIC(QQuickStyleSpec, styleSpec) +QStringList QQuickStylePrivate::stylePaths() +{ + const QString targetPath = QStringLiteral("QtQuick/Controls.2"); + const QStringList importPaths = QQmlEngine().importPathList(); + + QStringList paths; + for (const QString &importPath : importPaths) { + QDir dir(importPath); + if (dir.cd(targetPath)) + paths += dir.absolutePath(); + } + return paths; +} + QString QQuickStylePrivate::fallbackStyle() { return styleSpec()->fallbackStyle; @@ -307,4 +319,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 diff --git a/src/quickcontrols2/qquickstyle.h b/src/quickcontrols2/qquickstyle.h index d2e7faf1..4260411e 100644 --- a/src/quickcontrols2/qquickstyle.h +++ b/src/quickcontrols2/qquickstyle.h @@ -50,6 +50,7 @@ public: static QString path(); static void setStyle(const QString &style); static void setFallbackStyle(const QString &style); + static QStringList availableStyles(); }; QT_END_NAMESPACE diff --git a/src/quickcontrols2/qquickstyle_p.h b/src/quickcontrols2/qquickstyle_p.h index cfe87fbb..a893d20a 100644 --- a/src/quickcontrols2/qquickstyle_p.h +++ b/src/quickcontrols2/qquickstyle_p.h @@ -56,6 +56,7 @@ QT_BEGIN_NAMESPACE class Q_QUICKCONTROLS2_PRIVATE_EXPORT QQuickStylePrivate { public: + static QStringList stylePaths(); static QString fallbackStyle(); static bool isCustomStyle(); static void init(const QUrl &baseUrl); diff --git a/tests/auto/qquickstyle/tst_qquickstyle.cpp b/tests/auto/qquickstyle/tst_qquickstyle.cpp index 15edc67b..cc9cc75d 100644 --- a/tests/auto/qquickstyle/tst_qquickstyle.cpp +++ b/tests/auto/qquickstyle/tst_qquickstyle.cpp @@ -50,6 +50,7 @@ private slots: void lookup(); void commandLineArgument(); void environmentVariables(); + void availableStyles(); }; void tst_QQuickStyle::init() @@ -94,6 +95,13 @@ void tst_QQuickStyle::environmentVariables() QCOMPARE(QQuickStylePrivate::fallbackStyle(), QString("EnvVarFallbackStyle")); } +void tst_QQuickStyle::availableStyles() +{ + QStringList styles = QQuickStyle::availableStyles(); + QVERIFY(!styles.isEmpty()); + QCOMPARE(styles.first(), QString("Default")); +} + QTEST_MAIN(tst_QQuickStyle) #include "tst_qquickstyle.moc" |