/
imurzich
/
shulte
Обзор
Документация
Войти
/
imurzich
/
shulte
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.cpp
147 строк
4 KB
Igor Murzich
Надёжное исправление размера поля при запуске
18 июл 2026, 13:08
18 июл 2026, 13:08
46bc924
Код
Авторство
О чём код?
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include <QQuickWindow> #include <QIcon> #include <QDir> #include <QTranslator> #include <QLocale> #include <QSettings> #include <QLibraryInfo> #include "GameEngine.h" #include "Settings.h" static QQmlApplicationEngine *g_engine = nullptr; static QTranslator *g_translator = nullptr; static QTranslator *g_qtTranslator = nullptr; static QString findLocaleDir() { QStringList candidates; QString buildDir = QGuiApplication::applicationDirPath() + QStringLiteral("/locale"); candidates << buildDir; QString installDir = QStringLiteral(CMAKE_INSTALL_FULL_LOCALEDIR); if (!installDir.isEmpty()) candidates << installDir; for (const QString &dir : candidates) { if (QDir(dir).exists()) return dir; } return QString(); } static void applyLanguage(const QString &lang) { if (g_translator) { QCoreApplication::removeTranslator(g_translator); delete g_translator; g_translator = nullptr; } if (g_qtTranslator) { QCoreApplication::removeTranslator(g_qtTranslator); delete g_qtTranslator; g_qtTranslator = nullptr; } QStringList languages; if (!lang.isEmpty()) { languages << lang; } else { languages = QLocale::system().uiLanguages(); } QString localeDir = findLocaleDir(); g_translator = new QTranslator(); for (const QString &loc : languages) { QString shortLoc = loc.left(2); if (g_translator->load("shulte_" + shortLoc, localeDir)) break; if (g_translator->load("shulte_" + shortLoc, localeDir + "/" + shortLoc + "/LC_MESSAGES")) break; } QCoreApplication::installTranslator(g_translator); g_qtTranslator = new QTranslator(); QString qtDir = QLibraryInfo::path(QLibraryInfo::TranslationsPath); for (const QString &loc : languages) { QString shortLoc = loc.left(2); if (g_qtTranslator->load("qt_" + shortLoc, qtDir)) break; if (g_qtTranslator->load("qtbase_" + shortLoc, qtDir)) break; } QCoreApplication::installTranslator(g_qtTranslator); if (g_engine) { g_engine->retranslate(); } } int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); app.setOrganizationName("KDE"); app.setOrganizationDomain("org.kde"); app.setApplicationName("Schulte Table"); app.setDesktopFileName("shulte"); app.setWindowIcon(QIcon(QStringLiteral(":/shulte.png"))); GameEngine engine; Settings settings; { QString lang = settings.language(); applyLanguage(lang); } QQmlApplicationEngine engineQml; g_engine = &engineQml; engineQml.rootContext()->setContextProperty("gameEngine", &engine); engineQml.rootContext()->setContextProperty("appSettings", &settings); engineQml.loadFromModule("Shulte", "Main"); if (engineQml.rootObjects().isEmpty()) { fprintf(stderr, "Failed to load QML\n"); return -1; } QObject::connect(&settings, &Settings::languageChanged, &settings, [&settings]() { applyLanguage(settings.language()); }); auto *window = qobject_cast<QQuickWindow *>(engineQml.rootObjects().first()); if (window) { engine.setWindow(window); QSettings winSettings("KDE", "Schulte Table"); winSettings.beginGroup("Window"); if (winSettings.contains("Width")) { int x = winSettings.value("X", 100).toInt(); int y = winSettings.value("Y", 100).toInt(); int w = winSettings.value("Width", 700).toInt(); int h = winSettings.value("Height", 750).toInt(); if (x > -10000 && y > -10000 && w > 200 && h > 200) window->setGeometry(x, y, w, h); } winSettings.endGroup(); QObject::connect(&app, &QGuiApplication::aboutToQuit, window, [window]() { QSettings winSettings("KDE", "Schulte Table"); winSettings.beginGroup("Window"); winSettings.setValue("X", window->x()); winSettings.setValue("Y", window->y()); winSettings.setValue("Width", window->width()); winSettings.setValue("Height", window->height()); winSettings.endGroup(); winSettings.sync(); }); } return app.exec(); }