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

如何在QML中针对中韩语言修改特定UI控件的字体?

解决方案

一、C++层实现语言切换信号通知

既然你已经用C++类管理翻译文件,直接在该类中新增信号,每次切换语言并完成installTranslator调用后,发射信号通知QML:

#include <QObject>
#include <QTranslator>
#include <QLocale>

class TranslatorManager : public QObject
{
    Q_OBJECT
public:
    explicit TranslatorManager(QObject *parent = nullptr) : QObject(parent) {}

    // 你的语言切换方法(示例)
    Q_INVOKABLE void switchLanguage(const QString &languageCode) {
        // 卸载旧翻译器
        if (m_translator != nullptr) {
            qApp->removeTranslator(m_translator);
            delete m_translator;
            m_translator = nullptr;
        }

        // 加载新翻译文件(保留你原有查找QM的逻辑)
        m_translator = new QTranslator(this);
        QString qmPath = QString(":/translations/app_%1.qm").arg(languageCode);
        if (m_translator->load(qmPath)) {
            qApp->installTranslator(m_translator);
        }

        // 发射语言切换完成信号
        emit languageChanged(languageCode);
    }

signals:
    void languageChanged(const QString &languageCode);

private:
    QTranslator *m_translator = nullptr;
};

在main函数中将该类注册到QML上下文,让QML可以访问:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "translatormanager.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    TranslatorManager translatorManager;
    engine.rootContext()->setContextProperty("translatorManager", &translatorManager);

    const QUrl url(u"qrc:/main.qml"_qs);
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

二、QML层检测语言并动态修改字体

1. 初始化判断当前语言

QML可通过Qt.locale()获取当前语言环境,通过语言枚举值判断是否为中文或韩语:

Item {
    property bool isCJKLanguage: {
        const currentLang = Qt.locale().language;
        return currentLang === Qt.Language.Chinese || currentLang === Qt.Language.Korean;
    }

    Label { // Label1
        text: qsTr("Label1")
        // 根据语言切换字体,替换为你实际使用的中韩字体
        font.family: isCJKLanguage ? "Noto Sans SC" : "Arial"
    }

    Label { // Label2
        text: qsTr("Label2")
        // 保持原有字体配置
        font.family: "Arial"
    }
}

2. 响应语言切换信号

在QML中监听C++发射的languageChanged信号,实时更新语言判断状态:

Item {
    property bool isCJKLanguage: checkIfCJK()

    function checkIfCJK() {
        const currentLang = Qt.locale().language;
        return currentLang === Qt.Language.Chinese || currentLang === Qt.Language.Korean;
    }

    Component.onCompleted: {
        // 监听语言切换信号,更新状态
        translatorManager.languageChanged.connect(() => {
            isCJKLanguage = checkIfCJK();
        })
    }

    Label { // Label1
        text: qsTr("Label1")
        font.family: isCJKLanguage ? "Noto Sans SC" : "Arial"
    }

    Label { // Label2
        text: qsTr("Label2")
        font.family: "Arial"
    }
}

补充:通过语言代码直接判断

如果C++信号传递的是语言代码(如"zh"、"ko"),也可以直接在QML中判断:

translatorManager.languageChanged.connect((langCode) => {
    isCJKLanguage = langCode === "zh" || langCode === "ko";
})

关键说明

  • 调用installTranslator后,Qt.locale()会自动更新为新的语言环境,无需手动刷新。
  • 中韩字体需确保已正确打包到应用资源中,避免出现字体缺失问题。

内容的提问来源于stack exchange,提问作者Rasheduzzaman Sourov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:22:57