45void QQmlApplicationEnginePrivate::init()
47 Q_Q(QQmlApplicationEngine);
48 q->connect(q, &QQmlApplicationEngine::quit, QCoreApplication::instance(),
49 &QCoreApplication::quit, Qt::QueuedConnection);
50 q->connect(q, &QQmlApplicationEngine::exit, QCoreApplication::instance(),
51 &QCoreApplication::exit, Qt::QueuedConnection);
52 QObject::connect(q, &QJSEngine::uiLanguageChanged, q, [
this](){
53 _q_loadTranslations();
55#if QT_CONFIG(translation)
56 QTranslator* qtTranslator =
new QTranslator(q);
57 if (qtTranslator->load(QLocale(), QLatin1String(
"qt"), QLatin1String(
"_"), QLibraryInfo::path(QLibraryInfo::TranslationsPath), QLatin1String(
".qm")))
58 QCoreApplication::installTranslator(qtTranslator);
62 auto *selector =
new QQmlFileSelector(q,q);
63 selector->setExtraSelectors(extraFileSelectors);
64 QCoreApplication::instance()->setProperty(
"__qml_using_qqmlapplicationengine", QVariant(
true));
67void QQmlApplicationEnginePrivate::_q_loadTranslations()
69#if QT_CONFIG(translation)
70 Q_Q(QQmlApplicationEngine);
71 if (translationsDirectory.isEmpty())
74 auto translator = std::make_unique<QTranslator>();
75 if (!uiLanguage.value().isEmpty()) {
76 QLocale locale(uiLanguage);
77 if (translator->load(locale, QLatin1String(
"qml"), QLatin1String(
"_"), translationsDirectory, QLatin1String(
".qm"))) {
79 QCoreApplication::removeTranslator(activeTranslator.get());
80 QCoreApplication::installTranslator(translator.get());
81 activeTranslator.swap(translator);
84 activeTranslator.reset();
115void QQmlApplicationEnginePrivate::startLoad(QAnyStringView uri, QAnyStringView typeName)
117 Q_Q(QQmlApplicationEngine);
119 QQmlComponent *c =
new QQmlComponent(q, q);
123 auto *componentPriv = QQmlComponentPrivate::get(c);
124 componentPriv->prepareLoadFromModule(uri, typeName, QQmlTypeLoader::Synchronous);
126 const QQmlType type = componentPriv->loadHelperType();
128 if (type.sourceUrl().isValid()) {
129 const auto qmlDirData = QQmlTypeLoader::get(q)->getQmldir(type.sourceUrl());
130 const QUrl url = qmlDirData->finalUrl();
132 Q_ASSERT(url.scheme() !=
"qrc"_L1 || url.path().startsWith(
'/'_L1));
133 updateTranslationDirectory(url);
137
138
139
140
141 _q_loadTranslations();
142 componentPriv->completeLoadFromModule(uri, typeName);
144 ensureLoadingFinishes(c);
147void QQmlApplicationEnginePrivate::finishLoad(QQmlComponent *c)
149 Q_Q(QQmlApplicationEngine);
150 switch (c->status()) {
151 case QQmlComponent::Error:
152 qWarning() <<
"QQmlApplicationEngine failed to load component";
153 warning(c->errors());
154 q->objectCreated(
nullptr, c->url());
155 q->objectCreationFailed(c->url());
157 case QQmlComponent::Ready: {
158 auto newObj = initialProperties.empty() ? c->create() : c->createWithInitialProperties(initialProperties);
161 qWarning() <<
"QQmlApplicationEngine failed to create component";
162 warning(c->errors());
163 q->objectCreated(
nullptr, c->url());
164 q->objectCreationFailed(c->url());
169 QObject::connect(newObj, &QObject::destroyed, q, [&](QObject *obj) { objects.removeAll(obj); });
170 q->objectCreated(objects.constLast(), c->url());
173 case QQmlComponent::Loading:
174 case QQmlComponent::Null:
181void QQmlApplicationEnginePrivate::ensureLoadingFinishes(QQmlComponent *c)
183 Q_Q(QQmlApplicationEngine);
184 if (!c->isLoading()) {
188 QObject::connect(c, &QQmlComponent::statusChanged, q, [
this, c] {
this->finishLoad(c); });
191void QQmlApplicationEnginePrivate::updateTranslationDirectory(
const QUrl &url)
193 const QString scheme = url.scheme();
194 if (scheme ==
"file"_L1) {
195 translationsDirectory = translationsDirectoryFromLocalUrl(url);
196 }
else if (scheme ==
"qrc"_L1) {
197 translationsDirectory = translationsDirectoryFromLocalUrl(url);
199 translationsDirectory.clear();
322QQmlApplicationEngine::QQmlApplicationEngine(QAnyStringView uri, QAnyStringView typeName, QObject *parent)
323 : QQmlApplicationEngine(parent)
325 loadFromModule(uri, typeName);