i-6ren">
gpt4 book ai didi

qt - 如何使用 Qtranslator 翻译在 Qapp 中动态添加的字符串?

转载 作者:行者123 更新时间:2023-12-04 10:21:59 26 4
gpt4 key购买 nike

我试图用 Qt 语言学家创建一个 Qt 应用程序多语言。我将这段代码放在我的 MainWindow 的一个函数中:

translator.load(":/lang/English");
qApp->installTranslator(&translator);
ui->retranslateUi(this);

在我的 MainWindow.h 中声明了 QTranslator,我想要翻译的所有字符串都包含在 tr() 中。但是,所有由我的 MainWindow.cpp 代码动态添加的 QObject,例如 QTableWidget 的标题,都不会被翻译。如果我在我的 main.cpp 中放置另一个翻译器,我的所有字符串都会被翻译,但我必须在我的应用程序中创建语言按钮,所以我不能在 main.cpp 中放置翻译器。

你有什么想法可以帮助我吗?

感谢您的回答。

盖茨

最佳答案

当您使用 qApp->installTranslator(& aTranslator) 在您的应用程序中添加翻译时,所有 以下 调用 QObject::tr()(和类似功能)将在翻译器中查找翻译后的文本。所以你应该调用 retranslateUi() after qApp->installTranslator()。实际上你可能不会在那里调用它,你可以重新实现 QWidget::changeEvent() 并拦截任何 QEvent::LanguageChange 事件。

void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
// Someone called qApp->installTranslator() with a new translation.
// Let's update the user visible strings.

// This function was created by uic from the Designer form.
// It translates all user visible texts in the form.
ui->retranslateUi(this);

// This function must be written by you. It translates other user visible
// texts that are not in the form. See down for an example.
this->retranslateUi();
break;
default:
break;
}
}

ui->retranslateUi() 只是为 ui 中的每个用户可见字符串调用 QObject::tr()。它在 setupUi() 结束时自动调用,并用翻译后的文本填充表单的小部件(看看,它由 ui_MainWindow.h 文件中的 uic 定义)。您可能希望对其他用户可见文本采用类似的方法,例如 QTableWidget 的标题。所有字符串都设置在一个函数中(为了保持一致性,可能命名为 retranslateUi()),该函数在应用程序启动时(或者,更好的是,在创建相关小部件之后)以及每次加载新翻译时调用.

MainWindow::MainWindow(QWidget * parent)
: QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

// Creates other widgets, but do not set their user visible texts.
tableWidget = new QTableWidget(this);
...
someControl = new QLineEdit(this);
someOtherControl = new QSpinBox(this);

someModel = new MyModel(this);
...


// Ok, *now* we set their texts.
this->retranslateUi();
}

...

void MainWindow::retranslateUi()
{
// This function will be called (either manually or automatically by
// `changeEvent()`) when a new translator has installed, hence all the `tr()`
// calls will return the right translation for the last installed language.

QStringList labels;
labels.append(tr("First column"));
labels.append(tr("Second column"));
labels.append(tr("Third column"));

tableWidget->setHorizontalHeaderLabels(labels);

someControl->setText(tr("Control name"));
someOtherControl->setText(tr("Other control name"));

// Perhaps you have a model that need to be retranslated too
// (you need to write its `retranslateUi()` function):
someModel->retranslateUi();

...
}

此外,请注意,如果您正在做类似的事情

void MainWindow::someFunction()
{
...

QTranslator translator;
translator.load(":/lang/English");
qApp->installTranslator(& translator);

...
}

一旦该函数返回变量 translator 就被销毁,所以下一次 QObject::tr() 被调用存储在 qApp-> 中的地址installTranslator(& translator) 将无效。所以你必须用 new 在堆上分配 translator (当你不再需要它时,可能用 delete 删除它)。一个异常(exception)是,如果您在调用 QCoreApplication::exec() 之前在 main() 中执行此操作,因为该函数处于阻塞状态并且在应用程序关闭之前不会返回。

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

...

QTranslator translator;
translator.load(":/lang/English");
app.installTranslator(& translator);

...

app.exec(); // This function will return only on application's exit.
// Hence `translator` will outlive the application, there is
// no need to worry about it.
}

关于qt - 如何使用 Qtranslator 翻译在 Qapp 中动态添加的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11608851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com