46void QQmlApplicationEnginePrivate::init()
48 Q_Q(QQmlApplicationEngine);
49 q->connect(q, &QQmlApplicationEngine::quit, QCoreApplication::instance(),
50 &QCoreApplication::quit, Qt::QueuedConnection);
51 q->connect(q, &QQmlApplicationEngine::exit, QCoreApplication::instance(),
52 &QCoreApplication::exit, Qt::QueuedConnection);
53 QObject::connect(q, &QJSEngine::uiLanguageChanged, q, [
this](){
54 _q_loadTranslations();
56#if QT_CONFIG(translation)
57 const QStringList paths = QLibraryInfo::paths(QLibraryInfo::TranslationsPath);
58 for (
const QString &path : paths) {
59 auto qtTranslator = std::make_unique<QTranslator>(q);
60 if (qtTranslator->load(QLocale(), QLatin1String(
"qt"), QLatin1String(
"_"), path, QLatin1String(
".qm")))
61 QCoreApplication::installTranslator(qtTranslator.release());
64 auto *selector =
new QQmlFileSelector(q,q);
65 selector->setExtraSelectors(extraFileSelectors);
66 QCoreApplication::instance()->setProperty(
"__qml_using_qqmlapplicationengine", QVariant(
true));
69void QQmlApplicationEnginePrivate::_q_loadTranslations()
71#if QT_CONFIG(translation)
72 Q_Q(QQmlApplicationEngine);
73 if (translationsDirectory.isEmpty())
76 auto translator = std::make_unique<QTranslator>();
77 if (!uiLanguage.value().isEmpty()) {
78 QLocale locale(uiLanguage);
79 if (translator->load(locale, QLatin1String(
"qml"), QLatin1String(
"_"), translationsDirectory, QLatin1String(
".qm"))) {
81 QCoreApplication::removeTranslator(activeTranslator.get());
82 QCoreApplication::installTranslator(translator.get());
83 activeTranslator.swap(translator);
86 activeTranslator.reset();
117void QQmlApplicationEnginePrivate::startLoad(QAnyStringView uri, QAnyStringView typeName)
119 Q_Q(QQmlApplicationEngine);
121 QQmlComponent *c =
new QQmlComponent(q, q);
125 auto *componentPriv = QQmlComponentPrivate::get(c);
126 componentPriv->prepareLoadFromModule(uri, typeName, QQmlTypeLoader::Synchronous);
128 const QQmlType type = componentPriv->loadHelperType();
130 if (type.sourceUrl().isValid()) {
131 const auto qmlDirData = QQmlTypeLoader::get(q)->getQmldir(type.sourceUrl());
132 const QUrl url = qmlDirData->finalUrl();
134 Q_ASSERT(url.scheme() !=
"qrc"_L1 || url.path().startsWith(
'/'_L1));
135 updateTranslationDirectory(url);
139
140
141
142
143 _q_loadTranslations();
144 componentPriv->completeLoadFromModule(uri, typeName);
146 ensureLoadingFinishes(c);
149void QQmlApplicationEnginePrivate::finishLoad(QQmlComponent *c)
151 Q_Q(QQmlApplicationEngine);
152 switch (c->status()) {
153 case QQmlComponent::Error:
154 qWarning() <<
"QQmlApplicationEngine failed to load component";
155 warning(c->errors());
156 q->objectCreated(
nullptr, c->url());
157 q->objectCreationFailed(c->url());
159 case QQmlComponent::Ready: {
160 auto newObj = initialProperties.empty() ? c->create() : c->createWithInitialProperties(initialProperties);
163 qWarning() <<
"QQmlApplicationEngine failed to create component";
164 warning(c->errors());
165 q->objectCreated(
nullptr, c->url());
166 q->objectCreationFailed(c->url());
171 QObject::connect(newObj, &QObject::destroyed, q, [&](QObject *obj) { objects.removeAll(obj); });
172 q->objectCreated(objects.constLast(), c->url());
175 case QQmlComponent::Loading:
176 case QQmlComponent::Null:
183void QQmlApplicationEnginePrivate::ensureLoadingFinishes(QQmlComponent *c)
185 Q_Q(QQmlApplicationEngine);
186 if (!c->isLoading()) {
190 QObject::connect(c, &QQmlComponent::statusChanged, q, [
this, c] {
this->finishLoad(c); });
193void QQmlApplicationEnginePrivate::updateTranslationDirectory(
const QUrl &url)
195 const QString scheme = url.scheme();
196 if (scheme ==
"file"_L1) {
197 translationsDirectory = translationsDirectoryFromLocalUrl(url);
198 }
else if (scheme ==
"qrc"_L1) {
199 translationsDirectory = translationsDirectoryFromLocalUrl(url);
201 translationsDirectory.clear();
324QQmlApplicationEngine::QQmlApplicationEngine(QAnyStringView uri, QAnyStringView typeName, QObject *parent)
325 : QQmlApplicationEngine(parent)
327 loadFromModule(uri, typeName);