c++ - 是否可以在不重复代码的情况下动态翻译 Qt 应用程序?

标签 c++ qt qtranslate

我在我的项目中集成了 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/

相关文章:

wordpress - 如何在 wordpress 上使用 qtranslate 翻译我的导航菜单链接?

c++ - Arduino 中不需要的符号扩展

c++ - 将按钮放在QT中水平线的中心

C++解析文件路径

visual-studio - 在MSVC中找不到QTDIR错误构建项目

c++ - 调整 QGraphicsScene 大小时的事件

wordpress - qTranslate插件在同一页面切换语言

ajax - qtranslate 插件和 ajax 请求

c++ - 如何检查数组中的值

c++ - 在c++中返回指向 vector 元素的指针