我使用QQuickView在小部件应用程序中显示qml界面
m_window = new QQuickView();
m_container = QWidget::createWindowContainer(m_window,hostWidget,Qt::FramelessWindowHint);
m_container->setFocusPolicy(Qt::TabFocus);
m_window->setResizeMode(QQuickView::SizeRootObjectToView);
m_window->setSource(file_url);
我需要使qml界面多语言,所以在实例化QQuickView之前我将新的翻译安装到应用程序:
m_qmlTranslator = new QTranslator(this); // this - host QWidget
m_qmlTranslator->load(QString::fromUtf8("translate_%1").arg(QLocale::system().name()),strTranslationDir);
QScopedPointer<QCoreApplication> pAppl(QApplication::instance());
pAppl->installTranslator(m_qmlTranslator);
加载和 installTranslator 函数都返回true。 (目标语言的翻译存在于ts文件中并编译为qm文件,该文件位于右侧dir)
问题是在C ++翻译中运行良好,遵循代码输出目标语言中的字符串
qDebug() << tr("translation test");
但在QQuickView字符串中显示的qml界面保持未填充
Text {
id: title
text: qsTr("translation test")
font.pixelSize: 36
font.bold: true
anchors.horizontalCenter: parent.horizontalCenter
}
调试时我发现Qt为QCoreApplication::translate
调用qsTr("translation test")
函数并使用正确的 sourceText 变量,但来自self->d_func()->translators
的所有QTranslator都返回null QStrings 所以可见文本保持未翻译。
为什么会发生这种情况以及如何在QQuickView中翻译文本?
答案 0 :(得分:0)
我实际上也有这个问题 C++ 翻译可以工作,QML 翻译不会(QT 5.12.8)。我花了好几个小时才找到解决方案。
对于 qml 文件,我使用了 resource.qrc 文件。我以不同的方式命名了我的 QML 文件。因此,我给它们取了一个别名,而不是 status.qml。
this->pStatus->load(QUrl(QLatin1String("qrc:/statusQML")));
这没有用。解决方案:去掉资源文件中的别名并像这样打开:
this->pStatus->load(QUrl(QLatin1String("qrc:/status.qml")));
瞧。
希望这能让某人节省几个小时。我猜这可能是一个 QT-Bug。