Qt Translator не работает в лямбда-слоте

Я пытаюсь убедить мое приложение Qt перевести кнопки в пустое диалоговое окно. По неизвестной причине первый диалог переводится на немецкий, но диалог, выполненный в лямбда-слоте, не переводится. Я уже пытался использовать более старый синтаксис сигнала, чтобы увидеть, было ли лямбда-выражение проблемой, но это не изменило результат. После того, как конструктор 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";
}

Я получаю вывод "Базовый переводчик загружен". Кто-нибудь знает, что может помешать переводу?

1 ответ

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

}
Другие вопросы по тегам