为什么在Qt中创建main window之前必须加载语言包?

Why language packs have to be loaded before main window is created in Qt?

我刚刚学会了如何在 Qt 中为我的应用程序设置语言包,目前我有两个问题。我写了一个最小的应用程序来显示我困惑的地方。
我创建了一个主要的 window,它只包含一个 QLabel 来显示文本和一个 QPushButton 来将标签文本从中文更改为英文。
这是我的代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    chineseTr = new QTranslator;
    chineseTr->load("../untitled/Language-Pack_zh-CN.qm");
    englishTr = new QTranslator;
    englishTr->load("../untitled/Language-Pack_en-US.qm");
    QCoreApplication::installTranslator(chineseTr);

    mWidget = new QWidget;
    setCentralWidget(mWidget);
    hLayout = new QHBoxLayout;
    mWidget->setLayout(hLayout);
    mLbl = new QLabel;
    mLbl->setText(tr("Text"));
    translateBtn = new QPushButton;
    connect(translateBtn, &QPushButton::clicked, this, &MainWindow::translateText);
    hLayout->addWidget(mLbl);
    hLayout->addWidget(translateBtn);
}

void MainWindow::translateText()
{
    QCoreApplication::removeTranslator(chineseTr);
    QCoreApplication::installTranslator(englishTr);
}

问题一:
正如您在构造函数中看到的,我首先加载了语言包,否则 QLabel 将不会显示中文文本。我可以在构造函数中创建其他所有内容之前加载中文语言包,或者在创建 MainWindow 对象之前加载 main.cpp。我是不是弄错了,或者那些语言包只需要在创建 class 对象之前加载?

问题二:
正如您在代码中看到的那样,我单击按钮并删除了中文语言包并安装了新的翻译器以加载英文语言包。但没有任何效果。那么如何在应用程序中动态更改语言呢?我知道这个问题可能很简单,但我没有在网上找到任何有用的例子来告诉我该怎么做?那么有人可以告诉我执行此操作的方法或给我提示吗?

希望我能清楚地解释自己,并提前致谢。

了解 翻译发生的位置很重要:在 tr(...) 调用中。 tr(...) returns 翻译后的文本。这意味着,替换翻译器将影响对 tr(...) 的后续调用,但没有机会更改已显示在小部件中的文本。

最简单的方法 "switch language on the fly" 是引入包含所有 tr(...) 调用的方法,并在替换翻译器和构造函数后调用它。我相信从 .ui(由 QtDesigner 创建的)文件生成的代码已经有这样的方法。

void MainWindow::translate()
{
     mLbl->setText(tr("Text"));
}

void MainWindow::translateText()
{
    QCoreApplication::removeTranslator(chineseTr);
    QCoreApplication::installTranslator(englishTr);
    translate();
}