我在我的项目中集成了 QTranslator
类。到目前为止一切正常,并且在程序重新启动时所有文本字段都已翻译。现在我想提供动态翻译,所以用户不需要重新启动应用程序。
我在研究中发现,有必要像这样重新实现 changeEvent()
函数:
void MyWidget::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
titleLabel->setText(tr("Document Title"));
...
okPushButton->setText(tr("&OK"));
} else
QWidget::changeEvent(event);
}
(来源:http://doc.qt.io/qt-5/internationalization.html#dynamic-translation)
对于使用 Qt 设计器编写的应用程序,似乎可以只调用
ui->retranslateUi(this);
在 changeEvent()
函数中,所有文本字段都将被翻译。
但是对于应用程序中的所有其他文本,文本必须按照上面的示例进行设置。我觉得这很痛苦,因为当我改变某些东西时,我总是需要在两个地方更新文本(在 changeEvent
函数和我程序的主要部分)。
如果有很多文本字段,很容易漏掉一些东西。
有没有一种方法可以更新这些文本字段而无需复制“text-setting-methods”?
最佳答案
我不确定您为什么需要复制文本 setter 。
主要思想是在 changeEvent()
处理程序中设置一次可翻译文本并手动设置 send docs 中所述的 LanguageChange
事件.这也会触发子部件的事件。
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
titleLabel = new QLabel(this);
okPushButton = new QPushButton(this);
// Fire the LanguageChange event - the event handler will set the texts:
QEvent languageChangeEvent(QEvent::LanguageChange);
QCoreApplication::sendEvent(this, &languageChangeEvent);
}
void MyWidget::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
titleLabel->setText(tr("Document Title"));
okPushButton->setText(tr("&OK"));
} else {
QWidget::changeEvent(event);
}
}
您还可以使用一些初始的QCoreApplication::installTranslator()
。这将触发 LanguageChange
事件,无需手动发布。
另一种方法是使用您自己的函数而不是事件。这种方法通常是相同的,只是您需要为子窗口小部件手动调用您的函数。
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
titleLabel = new QLabel(this);
okPushButton = new QPushButton(this);
myChildWidget = new MyChildWidget(this);
retranslate();
}
void MyWidget::retranslate()
{
titleLabel->setText(tr("Document Title"));
okPushButton->setText(tr("&OK"));
myChildWidget->retranslate();
}
关于c++ - 是否可以在不重复代码的情况下动态翻译 Qt 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42787960/