我试图说服我的Qt应用程序翻译虚拟对话框中的按钮。由于未知原因,第一个对话框转换为德语,但在lambda插槽中执行的对话框无法翻译。我已经尝试使用较旧的信号语法来查看lambda表达式是否是问题,但它并没有改变结果。
RTWindow构造函数完成后,应用程序构造函数完成,main()
调用app.exec()
。没有我可以控制的代码可能会取代翻译器。
在此代码中,通过单击菜单项调用的回调将创建未翻译的对话框。在构造函数中创建的对话框已翻译。
我没有看到
RTWindow::RTWindow(QWidget *parent) : QMainWindow(parent)
{
ui.setupUi(this);
this->setWindowTitle("RodeTracker 2");
auto fileMenu = new QMenu("Datei");
auto configMenu = new QMenu("Bearbeiten");
auto clientAction = new QAction("Kunden ...");
configMenu->addAction(clientAction);
ui.menuBar->addMenu(fileMenu);
ui.menuBar->addMenu(configMenu);
// translates fine:
QMessageBox msgBox;
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
msgBox.exec();
connect(clientAction, &QAction::triggered, [=]()
{
// doesn't translate:
QMessageBox msgBox;
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
msgBox.exec();
});
}
翻译与这些行一起安装:( QApplication衍生构造函数)
QLocale::setDefault(QLocale(QLocale::German, QLocale::Germany));
QTranslator qtBaseTranslator;
if (qtBaseTranslator.load(QLocale::German, "qtbase", "_", ""))
{
installTranslator(&qtBaseTranslator);
qDebug() << "Base Translator loaded";
}
我加载了#34; Base Translator&#34;输出。有谁知道,翻译可能会有什么问题?
答案 0 :(得分:0)
QTranslator
对象需要在QApplication的完整生命周期内存在。在上面的示例中,在QAppDeriv
的构造函数中将转换器生成为局部变量将在构造期间正常但在此之后不会。正确的方法是在堆上创建QTranslator
。
QAppDeriv::QAppDeriv(int &argc, char **argv, int flags)
: QApplication(argc, argv, flags)
{
// set default local
QLocale::setDefault(QLocale(QLocale::German, QLocale::Germany));
// create translator objects on heap
QTranslator *qtTranslator = new QTranslator();
if (qtTranslator->load(QLocale::German, "qt", "_", ""))
{
installTranslator(qtTranslator);
}
QTranslator *qtBaseTranslator = new QTranslator();
if (qtBaseTranslator->load(QLocale::German, "qtbase", "_", ""))
{
installTranslator(qtBaseTranslator);
}
// create the main window
window = std::make_shared<RTWindow>();
window->show();
}