🐛 fix: pick QML controls style explicitly

This commit is contained in:
2026-08-21 17:43:02 +02:00
parent 2dfbd29ed1
commit 5d85acecf4
+37 -9
View File
@@ -1,8 +1,8 @@
#include <qobject.h>
#include <QApplication> #include <QApplication>
#include <QFileInfo>
#include <QQmlApplicationEngine> #include <QQmlApplicationEngine>
#include <QQmlContext> #include <QQmlContext>
#include <QQuickStyle>
#include <QSocketNotifier> #include <QSocketNotifier>
extern "C" { extern "C" {
@@ -21,6 +21,26 @@ using namespace WallReel::Core;
WALLREEL_DECLARE_SENDER("Main") WALLREEL_DECLARE_SENDER("Main")
static QString pickControlsStyle(const QQmlApplicationEngine& engine) {
// Respect env
if (!qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE"))
return {};
#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
using namespace Qt::StringLiterals;
// Prefer KDE style if available,
for (const QString& p : engine.importPathList())
if (QFileInfo::exists(p + u"/org/kde/desktop/qmldir"_s))
return u"org.kde.desktop"_s;
// fallback to Fusion
return u"Fusion"_s;
#else
for (const QString& p : engine.importPathList())
if (QFileInfo::exists(p + u"/org/kde/desktop/qmldir"_qs))
return u"org.kde.desktop"_qs;
return u"Fusion"_qs;
#endif
}
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
// Destruction order after QApplication quits its event loop: // Destruction order after QApplication quits its event loop:
// 1. QQmlApplicationEngine (with all QML objects) // 1. QQmlApplicationEngine (with all QML objects)
@@ -46,12 +66,14 @@ int main(int argc, char* argv[]) {
QApplication a(argc, argv); QApplication a(argc, argv);
a.setApplicationName(APP_NAME); a.setApplicationName(APP_NAME);
a.setApplicationVersion(APP_VERSION); a.setApplicationVersion(APP_VERSION);
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
using namespace Qt::StringLiterals; using namespace Qt::StringLiterals;
a.setWindowIcon(QIcon(u":/icon.svg"_s)); a.setWindowIcon(QIcon(u":/icon.svg"_s));
#else #else
a.setWindowIcon(QIcon(u":/%1.svg"_qs.arg(APP_NAME))); a.setWindowIcon(QIcon(u":/icon.svg"_qs));
#endif #endif
}
{ {
Logger::init(); Logger::init();
@@ -105,6 +127,10 @@ int main(int argc, char* argv[]) {
{ {
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
if (const QString s = pickControlsStyle(engine); !s.isEmpty()) {
QQuickStyle::setStyle(s);
}
QObject::connect( QObject::connect(
&engine, &engine,
&QQmlApplicationEngine::objectCreationFailed, &QQmlApplicationEngine::objectCreationFailed,
@@ -112,13 +138,15 @@ int main(int argc, char* argv[]) {
[]() { QCoreApplication::exit(-1); }, []() { QCoreApplication::exit(-1); },
Qt::QueuedConnection); Qt::QueuedConnection);
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
using namespace Qt::StringLiterals; using namespace Qt::StringLiterals;
engine.loadFromModule(UIMODULE_URI, u"Main"_s); engine.loadFromModule(UIMODULE_URI, u"Main"_s);
#else #else
engine.addImportPath(u"qrc:/"_qs); engine.addImportPath(u"qrc:/"_qs);
engine.load(QUrl(u"qrc:/WallReel/UI/Main.qml"_qs)); engine.load(QUrl(u"qrc:/WallReel/UI/Main.qml"_qs));
#endif #endif
}
bootstrap.start(); bootstrap.start();