詳解Qt如何實(shí)現(xiàn)一鍵加載qm文件
背景
多個(gè)子項(xiàng)目,分別翻譯生成的qm文件,如何一鍵加載?
.h
#include <QtCore/QObject> #include <QtCore/QTranslator> class LanguageSelector:public QObeject{ Q_OBJECT public: ~LanguageSelector() override = default; void setLanguage(const QString &l); QString getLanguage(); void addLanguageFile(const QString &n); void removeLanguageFile(const QString &n); void reload(); static LanguageSelector *getInstance(); signals: void languageChanged(const QString &l); privite: LanguageSelector(); static LanguageSelector* instance; static constexpr char CONFIGER_KEY[] = "system/language"; QString baseDir; QList<QString> languageFiles; QList<QTranslator *> translations; }
.cpp
#include "languageselector.h" #include <QApplication> #include <QCoreApplication> #include <QDebug> #include <QStringBuilder> #include <QSettings> LanguageSelector *LanguageSelector::instance = nullptr; constexpr char LanguageSelector::CONFIGER_KEY[]; QString LanguageSelector::getLanguage() { return QSettings::value( CONFIGER_KEY, defaultValue ); } void LanguageSelector::setLanguage(const QString &language) { QSettings qs; auto ov = QSettings::value( CONFIGER_KEY, defaultValue ); qs::setValue( CONFIGER_KEY, language); if(ov != l){ reload(); emit languageChanged( language); } } LanguageSelector *LanguageSelector::getInstance() { if(!instance){ instance = new LanguageSelector; } return instance; } LanguageSelector::LanguageSelector() : baseDir( "i18n" ) {} void LanguageSelector::addLanguageFile(const QString &name) { if(name.isEmpty()){ return; } languageFiles.append(name); } void LanguageSelector::removeLanguageFile(const QString &name) { if(name.isEmpty()){ return; } languageFiles.removeOne(name); } void LanguageSelector::reload() { auto language = getLanguage(); QString qmBase = QApplication::applicationDirPath() + "/" + baseDir; if(!qmBase.isEmpty() && !qmBase.endWith("/")){ qmBase += "/"; } if(!translations.isEmpty()){ for(auto const t : translations){ QCoreApplication::removeTranslator(t); t->deleteLater(); } } for(auto const &qm :languageFiles){ auto *t = new QTranslator(this); if(t->load(qmBase % qm % "_" % language )) translations.append(t); QCoreApplication::installTranslator(t); }else{ qDebug() << "can not load lang file:" << qm << ", language" << language ; } }
使用
main中,節(jié)目構(gòu)造之前添加:
auto ls = LanguageSelector::getInstance(); ls->addLangFile( "test" ); ls->addLangFile( "local" ); ls->addLangFile( "remote" ); ls->reload();
到此這篇關(guān)于詳解Qt如何實(shí)現(xiàn)一鍵加載qm文件的文章就介紹到這了,更多相關(guān)Qt加載qm文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)簡(jiǎn)單版圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單版圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06c語(yǔ)言函數(shù)如何求兩個(gè)數(shù)的最大值
這篇文章主要介紹了c語(yǔ)言函數(shù)如何求兩個(gè)數(shù)的最大值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12C語(yǔ)言預(yù)編譯#define(預(yù)處理)
這篇文章主要介紹了C語(yǔ)言預(yù)編譯#define(預(yù)處理),#define 機(jī)制包括了一個(gè)機(jī)制,允許把參數(shù)替換到文本中,這種實(shí)現(xiàn)通常稱為宏或者宏定義,下文更多的相關(guān)資料介紹需要的小伙伴可以參考一下2022-04-04c語(yǔ)言socket多線程編程限制客戶端連接數(shù)
這篇文章主要介紹了c語(yǔ)言socket多線程編程,可以限制客戶端連接數(shù),大家參考使用吧2013-12-12C++ RTTI與4種類(lèi)型轉(zhuǎn)換的深入理解
這篇文章主要給大家介紹了關(guān)于C++ RTTI與4種類(lèi)型轉(zhuǎn)換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03