You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

改用@QmlElement单例后Python-QML翻译失效问题求助

解决@QmlElement单例模式下的QML即时翻译问题

核心问题根源

你在retranslate方法中重新初始化QQmlApplicationEngine的逻辑完全错误——新创建的引擎和当前运行的UI引擎并非同一个实例,调用它的retranslate()自然无法影响已加载的QML界面。

可行解决方案

方案1:静态变量注入运行中引擎(推荐)

  1. 在MyAPI类中保留静态_engine变量,但禁止在retranslate方法内初始化新引擎。
  2. 应用启动时,创建好QQmlApplicationEngine实例后,直接给静态变量赋值:
engine = QQmlApplicationEngine()
MyAPI._engine = engine
  1. 保持retranslate方法原有逻辑,直接调用静态变量的retranslate():
from PySide6.QtCore import QObject, Slot
from PySide6.QtQml import QmlElement, QmlSingleton

QML_IMPORT_NAME = "com.example.api"
QML_IMPORT_MAJOR_VERSION = 1

@QmlElement
@QmlSingleton
class MyAPI(QObject):
    _engine = None

    @Slot()
    def retranslate(self):
        if self._engine:
            self._engine.retranslate()

方案2:QML侧传递引擎实例

在QML根组件加载完成后,将当前引擎实例传递给MyAPI:

// 根QML文件
import com.example.api 1.0

Window {
    Component.onCompleted: {
        MyAPI.setEngine(Qt.application.engine)
    }
}

对应MyAPI类添加槽函数存储引擎:

@QmlElement
@QmlSingleton
class MyAPI(QObject):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._engine = None

    @Slot(QObject)
    def setEngine(self, engine):
        self._engine = engine

    @Slot()
    def retranslate(self):
        if self._engine:
            self._engine.retranslate()

方案3:利用Qt全局翻译事件(无引擎依赖)

无需持有引擎实例,直接通过Qt的事件机制触发全量翻译刷新:

from PySide6.QtCore import QCoreApplication, QEvent

@QmlElement
@QmlSingleton
class MyAPI(QObject):
    @Slot()
    def retranslate(self):
        # 重新安装翻译器(根据你的逻辑调整)
        # QCoreApplication.instance().installTranslator(your_translator)
        # 发送语言变化事件触发全量刷新
        QCoreApplication.instance().postEvent(
            QCoreApplication.instance(), 
            QEvent(QEvent.LanguageChange)
        )

关键注意事项

  • 无论采用哪种方案,绝对不能在运行时创建新的QQmlApplicationEngine实例用于翻译,必须操作当前正在运行的引擎实例。
  • 方案1完全保留@QmlElement的静态分析能力,且逻辑最贴合你原有实现。

内容的提问来源于stack exchange,提问作者Andrei Miculiță

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:40:15