这是我的尝试:
我将我的语言QAction连接到一个插槽,该插槽获取用户选择的语言,然后将其保存并转到另一个功能来安装翻译.这一切都发生在QMainWindow之外.
voID MainCore::GetAndSaveLanguage(bool){ //Getting the language the users wants. bool OKpressed; QString Language = QinputDialog::getItem(NulL,inputDialogString,inputDialogString + ":",Languages,false,&OKpressed) .remove(QRegExp("*(",Qt::CaseSensitive,QRegExp::Wildcard)).remove(')'); //Checking if ok button was pressed. if(OKpressed){ //Saving the languages. Settings->beginGroup("Settings"); Settings->setValue("Language",Language); Settings->endGroup(); //Update language. UpdateTranslations(Language); }}voID MainCore::UpdateTranslations(QString Language){ //Setting the translation for the qt Widgets. QTranslator QtTranslator; QtTranslator.load("qt_" + Language,QlibraryInfo::location(QlibraryInfo::TranslationsPath)); QApplication::instance()->installTranslator(&QtTranslator); //Setting the translation for the program. QTranslator AppTranslator; AppTranslator.load("app_" + Language,":/translations"); QApplication::instance()->installTranslator(&AppTranslator);}
我还在QMainWindow上有一个函数,它设置屏幕的所有文本,如下所示:
voID Window::SetText(){ Menu->setTitle(tr("file")); ...}
在构造窗口和changeEvent函数时调用它:
voID Window::changeEvent(QEvent *event){ if(event->type() == QEvent::LanguageChange){ SetText(); }else{ QWidget::changeEvent(event); }}解决方法 问题是你在堆栈中分配你的QtTranslator(相同的AppTranslator),它在UpdateTranslations结束时超出了范围
voID MainCore::UpdateTranslations(QString Language){ //Setting the translation for the qt Widgets. QTranslator QtTranslator; QtTranslator.load("qt_" + Language,QlibraryInfo::location(QlibraryInfo::TranslationsPath)); QApplication::instance()->installTranslator(&QtTranslator); // this is a bad reference ...} // QtTranslator will go out of scope
只要您的应用程序正在运行,您就需要QtTranslator才能生存.所以一种选择是在堆中分配它
QTranslator * QtTranslator = new QTranslator;
并且您需要保留对QtTranslator的引用以便以后删除它…
总结以上是内存溢出为你收集整理的c – 如何动态翻译qt应用程序?全部内容,希望文章能够帮你解决c – 如何动态翻译qt应用程序?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)