У меня есть свой класс, в котором мне нужно сохранить новый выбранный язык и одновременно изменить язык приложения. Пример, основанный на примере проекта StackView в QtCreator:
//main.cpp
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
qmlRegisterType<CustomClass>("io.qt.CustomClass", 1, 0, "CustomClass");
QTranslator translator;
translator.load(":/EN.qm");
app.installTranslator(&translator);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
//customclass.h
class CustomClass : public QObject
{
Q_OBJECT
public:
explicit CustomClass(QObject *parent = nullptr) : QObject(parent) {}
Q_INVOKABLE void change(){
QTranslator translator;
QApplication::removeTranslator(&translator);
translator.load(":/CZ.qm");
QApplication::installTranslator(&translator);
//QQmlApplicationEngine * engine = qobject_cast<QQmlApplicationEngine *>(qmlEngine(this));
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
engine->retranslate();
}
};
//main.qml
...
CustomClass{id:test}
...
ItemDelegate {
text: qsTr("Page 1")
width: parent.width
onClicked: {
test.change()
drawer.close()
}
}...
//.pro file
QT += quick gui core
...
TRANSLATIONS = EN.ts CZ.ts
...
HEADERS += \
customclass.h
В этом примере нажатие на кнопку Page 1 должно изменить язык.
Мое приложение основано на StackView, и когда я вызываю функцию с этим кодом, кажется, что все работает. Строки переведены. Однако, когда я помещаю новый элемент в стек (например, открываю новый раздел из меню), строки возвращаются на исходном языке до изменения. Это как ретрансляция изменяет только видимые в данный момент строки.
Кто-нибудь знает, где проблема? Я подозреваю, что двигатель не был правильно приобретен. Это пользовательский класс, который мне нужно зарегистрировать (qmlRegisterType) для использования в qml, и я не уверен, как правильно получить движок (поскольку движок создается в основной функции).