Почему языковые пакеты должны быть загружены перед созданием главного окна в Qt? - PullRequest
0 голосов
/ 04 мая 2018

Я только что узнал, как установить языковой пакет для моего приложения в 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. Я ошибаюсь или эти языковые пакеты должны быть загружены перед созданием объектов класса?

Вопрос второй:
Как вы можете видеть в коде, я нажал кнопку и, чтобы удалить пакет для китайского языка и установить новый переводчик для загрузки пакета для английского языка. Но ничего не работает. Так как я могу динамически менять язык в приложении? Я знаю, что этот вопрос может быть простым, но я не нахожу в Интернете никакого полезного примера, чтобы показать мне, как это сделать? Так может кто-нибудь показать мне способ сделать это или дать мне подсказку?

Надеюсь, я объясню четко и заранее спасибо.

1 Ответ

0 голосов
/ 04 мая 2018

Важно понимать , где происходит перевод: внутри tr(...) вызов. tr(...) возвращает переведенный текст. Это означает, что замена переводчика повлияет на последующие вызовы на tr(...), но не сможет изменить тексты, уже отображаемые в виджетах.

Самый простой способ «переключить язык на лету» - это ввести метод, содержащий все вызовы tr(...), и вызывать его после замены переводчика и в конструкторе. Я считаю, что код, сгенерированный из файлов .ui (созданных QtDesigner), уже имеет такой метод.

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

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