【发布时间】:2021-08-13 08:30:17
【问题描述】:
我知道 QML 中字符串的翻译过程。但是有没有办法用 QML 函数完全翻译 QML 属性?我正在使用 PySide2,我需要翻译在 Python 和 QML 端定义的属性。作为一个还没有翻译功能的简约示例:
主要。 py
class example_model(QObject):
def __init__(self, parent=None):
super().__init__(parent=parent)
self._model = QStandardItemModel()
@Property(str, constant=True)
def python_property(self):
return "Example String"
def main():
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
context = engine.rootContext()
model = example_model( parent=context)
context.setContextProperty("exampleModel", model)
engine.load(QUrl(QUrl.fromLocalFile(os.path.join(os.path.dirname(inspect.getfile(lambda: None)), "main.qml"))))
return app.exec_()
if __name__ == '__main__':
sys.exit(main())
main.qml
import QtQuick 2.12
import QtQuick.Controls 2.12
ApplicationWindow {
id: root
width: 200
height: 400
visible: true
property string qmlProperty: "exampleString"
Text{
text: QT_TR_NOOP(exampleModel.python_property)
}
Text{
text: QT_TR_NOOP(root.qmlProperty)
}
}
我怎样才能实现这两个属性(python_property 和qmlProperty)分别被 Qt 的 lupdate 函数或任何其他函数正确检测到。我需要动态翻译,所以会用到engine.retranslate()函数。
【问题讨论】:
-
首先,
QT_TR_NOOP,顾名思义,是无操作的,所以你在这里使用它的方式不会有任何作用。你应该把它放在"exampleString"周围让 lupdate 检测到它。而且我认为您可以通过将qsTr用于两个绑定而不是QT_TR_NOOP来完成您的任务,但不能100% 确定。值得注意的是,lupdate 将main.qml作为上下文,因此您应该注意QT_TR_NOOP和qsTr的使用位置
标签: python qml translation pyside2