zoukankan      html  css  js  c++  java
  • QT in VS 多语言实现(中英文切换,每个步骤都有截图,只有UTF8才能让Qt语言家正确读取。先qApp->removeTranslator,然后installTranslator,每个类都要写上槽函数RetranslateUI)

    最近项目需要软件具有中英文双语切换功能,而QT又自带此功能,现将实现方式记录下来。
    说到中英文切换,少不了要了解QT的内部编码方式。在此就不详述QT编码方式了,具体可参考 彻底弄懂Qt的编码。只需要记住QT采用utf-8编码!window操作系统采用ansi编码,简体中文操作系统的ansi代表gbk。

    1. 生成.ts文件
    前置步骤:所有需要翻译的内容用QObject::tr()包起来。具体自行了解一下QObject::tr()的功能。

    先创建一个factory类:

    // factory.cpp
    factory::factory()
    {
    QString str = QObject::tr("我是中国人");
    }
    1
    2
    3
    4
    5
    打开项目 =>【QT VS TOOLS】=> 【Create New Translation File】=> 【选择语言】=> 【ok】创建ts文件,默认在项目根目录。


    2. 打开linguis,打开ts文件,翻译,生成qm文件
    【QT VS TOOLS】=> 【Launch Qt Linguist】=> 等待打开linguist工具 =>【linguist打开ts文件】


    打开ts文件后看到乱码:


    导致的原因是源码文件采用的非utf-8编码格式,要将源码文件改为utf-8格式。
    解决方式:【在vs中打开源码文件】=> 【文件】=> 【高级保存选项】=> 【编码:Unicode(utf-8 带签名)】=> 像上述一样再次创建ts文件


    再打开linguist看一下:


    翻译,然后生成qm文件 【文件】 => 【发布】即可在项目根目录下生成一个与ts同名的qm文件。

    3. 中英文切换
    这里是重点了,就不使用之前的代码了。实现一个登陆页面语言切换功能。
    新建一个CLinguist类,用于语言管理:

    // Linguist.h
    #pragma once
    /*
    语言家,配置当前系统的语言
    */

    #include <QObject>
    #include <qtranslator.h>

    enum Language
    {
    zh_cn,
    en_us,
    undefined
    };

    class CLinguist :public QObject
    {
    Q_OBJECT
    private:
    CLinguist();

    public:
    // 当前语言 简体中文、英文、未定义
    Language m_CurrentLanguage = Language::undefined;
    // 切换语言
    void ChangeLanguage(Language lan);
    static CLinguist * GetLinguistInstance();
    private:
    static CLinguist * linguist;
    QTranslator * m_trans;
    signals:
    // 语言切换信号,通知当前系统语言已经被切换
    void LanguageChaned();
    };

    //Linguist.cpp
    #include "Linguist.h"
    #include <qcoreapplication.h>
    CLinguist * CLinguist::linguist = nullptr;
    CLinguist::CLinguist()
    {
    m_trans = new QTranslator;
    }

    CLinguist * CLinguist::GetLinguistInstance()
    {
    if (nullptr == linguist)
    {
    linguist = new CLinguist;
    }

    return linguist;
    }

    void CLinguist::ChangeLanguage(Language lan)
    {
    if (lan == this->m_CurrentLanguage || lan == Language::undefined) return;
    bool ret;
    switch (lan)
    {
    case zh_cn:
    if (nullptr != m_trans)
    {
    qApp->removeTranslator(m_trans);
    }
    ret = m_trans->load("snirisaccesssys_zh.qm");
    if (ret)
    {
    qApp->installTranslator(m_trans);
    }
    break;
    case en_us:
    if (nullptr != m_trans)
    {
    qApp->removeTranslator(m_trans);
    }
    ret = m_trans->load("snirisaccesssys_en.qm");
    if (ret)
    {
    qApp->installTranslator(m_trans);
    }
    break;
    default:
    break;
    }
    if(ret)
    {
    this->m_CurrentLanguage = lan;
    // 发出语言被切换的信号
    emit LanguageChaned();
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    在main函数中设置默认的语言:

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);

    /**
    ......
    */

    CLinguist* lin = CLinguist::GetLinguistInstance();
    lin->ChangeLanguage(Language::zh_cn);

    /**
    ......
    */
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    登陆类CLogin:

    // Login.h
    #pragma once
    #if _MSC_VER >= 1600
    #pragma execution_character_set("utf-8")
    #endif

    #include <QObject>
    #include <qwidget.h>
    #include <qpushbutton.h>
    #include <qlineedit.h>
    #include <qgridlayout.h>
    #include <qlabel.h>
    #include <qboxlayout.h>
    #include <qmessagebox.h>
    #include <qcombobox.h>
    #include <qtranslator.h>

    class CLogin : public QDialog
    {
    Q_OBJECT

    public:
    CLogin(QWidget *parent = 0);
    ~CLogin();
    /**
    ... 省略了部分内容,包括布局控件和登陆取消按钮...
    */

    QPushButton * m_btnChangeLanguage;
    QLineEdit * m_leUserName;
    QLineEdit * m_lePwd;
    QTranslator* m_translator;
    QLabel * m_lblUserName;
    QLabel * m_lblPwd;

    void on_btnChangeLanguage_clicked();

    // 刷新ui界面的文字
    void RetranslateUI();

    // 这句比较重要,连接信号槽,因为是单例,所以想买中所有需要切换语言的地方都需要连接CLinguist::LanguageChaned信号
    CLinguist* lin = CLinguist::GetLinguistInstance();
    connect(lin, &CLinguist::LanguageChaned, this, &CBaseForm::RetranslateUI);
    };

    // Login.cpp
    #include "Login.h"
    #include "Linguist.h"

    CLogin::CLogin(QWidget *parent, int id)
    : CBaseForm(id, parent)
    {
    /**
    ...省略各种控件初始化及布局操作
    */
    m_btnChangeLanguage = new QPushButton;
    connect(m_btnChangeLanguage, &QPushButton::clicked, this, &CLogin::on_btnChangeLanguage_clicked);

    RetranslateUI();
    }

    CLogin::~CLogin()
    {
    }

    void CLogin::RetranslateUI()
    {
    m_lblUserName->setText(tr("用户名:"));
    m_lblPwd->setText(tr("密 码:"));
    m_btnChangeLanguage->setText(tr("中文"));
    }

    void CLogin::on_btnChangeLanguage_clicked()
    {
    CLinguist* lin = CLinguist::GetLinguistInstance();

    if (lin->m_CurrentLanguage == Language::en_us)
    {
    lin->ChangeLanguage(Language::zh_cn);
    }
    else
    {
    lin->ChangeLanguage(Language::en_us);
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86


    还有一点想说一下,如何实现中英文切换按钮在设置为中文的时候显示【English】,设置为英文的时候显示【中文】,看下面的图你就懂了:

    就是翻译的时候English译文为【中文】,汉语译文为【English】即可!
    ---------------------
    作者:david大伟哥
    来源:CSDN
    原文:https://blog.csdn.net/lwwl12/article/details/80485123
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    二维vector初始化
    分类、目标检测、语义分割、实例分割的区别
    天池博客链接
    Windows pycocotools 安装
    解决 windows下pd.read_csv()读取文件失败
    解决 Anaconda中已有库 notebook却无法import
    win10下 修改Jupyter Notebook的默认路径
    C++ stack操作
    nginx启动错误
    Selenium的PageObject模式
  • 原文地址:https://www.cnblogs.com/findumars/p/10332211.html
Copyright © 2011-2022 走看看