1

我刚刚学会了如何在 Qt 中为我的应用程序设置语言包,我目前有两个问题。我写了一个最小的应用程序来显示让我感到困惑的地方。
我创建了一个主窗口,其中仅包含一个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就是不显示中文。我可以在构造函数中创建其他所有内容之前加载中文语言包,也可以main.cpp在创建MainWindow对象之前加载。我是不是弄错了,还是只需要在创建类对象之前加载那些语言包?

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

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

4

1 回答 1

2

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

进行“动态切换语言”的最简单方法是引入包含所有tr(...)调用的方法,并在替换翻译器和构造函数后调用它。我相信从.ui(由 QtDesigner 创建的)文件生成的代码已经具有这种方法。

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

void MainWindow::translateText()
{
    QCoreApplication::removeTranslator(chineseTr);
    QCoreApplication::installTranslator(englishTr);
    translate();
}
于 2018-05-04T15:56:36.093 回答