0

我试图说服我的 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";
}

我得到“加载了基本翻译器”的输出。有谁知道,翻译有什么问题吗?

4

1 回答 1

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();

}
于 2017-11-28T21:52:36.420 回答