QQmlEngine ретранслирует, не переводя другие элементы StackView - PullRequest
0 голосов
/ 14 июня 2019

У меня есть свой класс, в котором мне нужно сохранить новый выбранный язык и одновременно изменить язык приложения. Пример, основанный на примере проекта 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, и я не уверен, как правильно получить движок (поскольку движок создается в основной функции).

1 Ответ

0 голосов
/ 03 июля 2019

Я использовал подвох, чтобы добиться полного перевода приложения без необходимости использовать движок в своем классе. Это не префект, но это работает. Я добавил цикл в main, как это:

    int returnValue = 0;
    do
    {
        QApplication app(argc, argv);
        QTranslator translator;
        translator.load(":/translation/"+langString+".qm"); //langString might be the "CZ" as in the question example
        app.installTranslator(&translator);

        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/src/qml/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;

        returnValue = app.exec();

        langString = settings.value("language").toString();
    }
    while(returnValue == TRANSLATION_RESTART);


    return returnValue;

Так что в моем пользовательском классе я просто выхожу из приложения, используя:

    qApp->exit(TRANSLATION_RESTART);

И я также сохраняю значение langString. Таким образом, приложение в основном перезапускается с новым языком.

...