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

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

Решение

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

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]