• Qt实现多国语言(即界面翻译)可实时进行切换


    1.在工程文件添加
    TRANSLATIONS = debug/lang_English.ts 
                   debug/lang_Chinese.ts
                   
    2.在需要翻译的地方用上tr
    例如:setText(tr("hello world"));
    
    3.提供一个更改语言的接口
    void MainWindow::changeTr(int language)
    
    4.重载void changeEvent(QEvent *e); 对语言改变事件进行处理
    
    5.利用qt语言家更新翻译,手工翻译生成的.ts文件之后,再进行发布翻译

    下面是个简单例子:

    //mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QLabel>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        void changeEvent(QEvent *e);
    
        void changeTr(int language_label);
    
    private:
        Ui::MainWindow *ui;
        QLabel  *label,*label1;
    };
    
    #endif // MAINWINDOW_H
    //mainwindows.cpp
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QLabel>
    #include <QTranslator>
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        label = new QLabel(this);
        label1 = new QLabel(this);
    
        label->setText(tr("hello world"));
        label1->setText(tr("hello"));
    
        label1->move(label->x(),label->y()+label->height());
    
        ui->setupUi(this);
    
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::changeTr(int language_label)
    {
        QString qmFilename;
        static QTranslator* translator;
        if (translator != NULL)
        {
            qApp->removeTranslator(translator);
            delete translator;
            translator = NULL;
        }
        translator = new QTranslator(this);
    
        QString runPath = QCoreApplication::applicationDirPath();       //获取文件运行路径
        qDebug() << runPath;
        if(language_label==1)
        {
            qmFilename = runPath + "/lang_Chinese.qm";
        }
        else
        {
            qmFilename = runPath + "/lang_English.qm";
        }
        qDebug() << qmFilename;
        if (translator->load(qmFilename))
        {
            qDebug() << "installTranslator";
            qApp->installTranslator(translator);
        }
    //    ui->retranslateUi(this);             // 重新设置界面显示
    }
    
    void MainWindow::changeEvent(QEvent *e)
    {
        //    MainWindow::changeEvent(e);
        switch (e->type())
        {
        case QEvent::LanguageChange:
            qDebug() << "changeEvent" << e->type();
            label->setText(tr("hello world"));
            label1->setText(tr("hello"));
            ui->retranslateUi(this);
            break;
        default:
            break;
        }
    }
    //main.cpp
    #include "mainwindow.h"
    #include <QApplication>
    #include <QThread>
    #include "stdlib.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
    
    //    w.changeTr(1);
    
        w.show();
        w.changeTr(1);
    
    
        return a.exec();
    }
  • 相关阅读:
    Mac下终端常用命令
    mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
    Mac版 Intellij IDEA 激活
    解决Pods Unable to find a specification for `xxxxx`问题
    java并发编程(十五)内存可见两种方式 加锁和volatile
    java并发编程(五)正确使用volatile
    java并发编程(十四)同步问题的内存可见性
    java并发编程(十三)经典问题生产者消费者问题
    java并发编程(十三)线程间通信中notifyAll造成的早期通知问题
    java并发编程(十一)线程间的通信notify通知的遗漏
  • 原文地址:https://www.cnblogs.com/nanqiang/p/10385073.html
Copyright © 2020-2023  润新知