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 QTranslator* qtTranslator =
new QTranslator(q);
58 if (qtTranslator->load(QLocale(), QLatin1String(
"qt"), QLatin1String(
"_"), QLibraryInfo::path(QLibraryInfo::TranslationsPath), QLatin1String(
".qm")))
59 QCoreApplication::installTranslator(qtTranslator);
63 auto *selector =
new QQmlFileSelector(q,q);
64 selector->setExtraSelectors(extraFileSelectors);
65 QCoreApplication::instance()->setProperty(
"__qml_using_qqmlapplicationengine", QVariant(
true));
68void QQmlApplicationEnginePrivate::_q_loadTranslations()
70#if QT_CONFIG(translation)
71 Q_Q(QQmlApplicationEngine);
72 if (translationsDirectory.isEmpty())
75 auto translator = std::make_unique<QTranslator>();
76 if (!uiLanguage.value().isEmpty()) {
77 QLocale locale(uiLanguage);
78 if (translator->load(locale, QLatin1String(
"qml"), QLatin1String(
"_"), translationsDirectory, QLatin1String(
".qm"))) {
80 QCoreApplication::removeTranslator(activeTranslator.get());
81 QCoreApplication::installTranslator(translator.get());
82 activeTranslator.swap(translator);
85 activeTranslator.reset();
116void QQmlApplicationEnginePrivate::startLoad(QAnyStringView uri, QAnyStringView typeName)
118 Q_Q(QQmlApplicationEngine);
120 QQmlComponent *c =
new QQmlComponent(q, q);
124 auto *componentPriv = QQmlComponentPrivate::get(c);
125 componentPriv->prepareLoadFromModule(uri, typeName, QQmlTypeLoader::Synchronous);
127 const QQmlType type = componentPriv->loadHelperType();
129 if (type.sourceUrl().isValid()) {
130 const auto qmlDirData = QQmlTypeLoader::get(q)->getQmldir(type.sourceUrl());
131 const QUrl url = qmlDirData->finalUrl();
133 Q_ASSERT(url.scheme() !=
"qrc"_L1 || url.path().startsWith(
'/'_L1));
134 updateTranslationDirectory(url);
138
139
140
141
142 _q_loadTranslations();
143 componentPriv->completeLoadFromModule(uri, typeName);
145 ensureLoadingFinishes(c);
148void QQmlApplicationEnginePrivate::finishLoad(QQmlComponent *c)
150 Q_Q(QQmlApplicationEngine);
151 switch (c->status()) {
152 case QQmlComponent::Error:
153 qWarning() <<
"QQmlApplicationEngine failed to load component";
154 warning(c->errors());
155 q->objectCreated(
nullptr, c->url());
156 q->objectCreationFailed(c->url());
158 case QQmlComponent::Ready: {
159 auto newObj = initialProperties.empty() ? c->create() : c->createWithInitialProperties(initialProperties);
162 qWarning() <<
"QQmlApplicationEngine failed to create component";
163 warning(c->errors());
164 q->objectCreated(
nullptr, c->url());
165 q->objectCreationFailed(c->url());
170 QObject::connect(newObj, &QObject::destroyed, q, [&](QObject *obj) { objects.removeAll(obj); });
171 q->objectCreated(objects.constLast(), c->url());
174 case QQmlComponent::Loading:
175 case QQmlComponent::Null:
182void QQmlApplicationEnginePrivate::ensureLoadingFinishes(QQmlComponent *c)
184 Q_Q(QQmlApplicationEngine);
185 if (!c->isLoading()) {
189 QObject::connect(c, &QQmlComponent::statusChanged, q, [
this, c] {
this->finishLoad(c); });
192void QQmlApplicationEnginePrivate::updateTranslationDirectory(
const QUrl &url)
194 const QString scheme = url.scheme();
195 if (scheme ==
"file"_L1) {
196 translationsDirectory = translationsDirectoryFromLocalUrl(url);
197 }
else if (scheme ==
"qrc"_L1) {
198 translationsDirectory = translationsDirectoryFromLocalUrl(url);
200 translationsDirectory.clear();
323QQmlApplicationEngine::QQmlApplicationEngine(QAnyStringView uri, QAnyStringView typeName, QObject *parent)
324 : QQmlApplicationEngine(parent)
326 loadFromModule(uri, typeName);