• 6339阅读
  • 2回复

Qt tr()翻译 加载 问题 [复制链接]

上一主题 下一主题
离线fywz234
 

只看楼主 倒序阅读 楼主  发表于: 2014-12-22
关键词: qm,tr,国际化
   加载qm时,有些没有翻译过来,显示的还是原本的! 是这样的,我想把所有成员变量写在一个类中,这些成员变量是公共 的,供其它类来访问修改,那么问题来了:在其它类中调用全局变量或全局类后翻译后,加载时没有翻译过来,都保持了原样;  网上说的大部分资料我都看过,大部分针对的是乱码问题,对于我这种形式的介绍的比较少,我不知道怎么办,所以来求助各位大侠:
我的问题就是:全局的类实例变量, 在其它类中访问类成员的时候,用Qt Linguist 翻译后没有加载翻译过来!
[color=rgba(0, 0, 0, 0)]代码抽出来了,简化成以下示例:
test.pro:[color=rgba(0, 0, 0, 0)]
  1. QT += core gui
  2. TARGET = Test
  3. TEMPLATE = app
  4. SOURCES += main.cpp test.cpp global.cpp
  5. HEADERS  += test.h global.h
  6. FORMS    += test.ui
  7. TRANSLATIONS =  test.ts
  8. RESOURCES +=  test.qrc

全局类:
global.h:[color=rgba(0, 0, 0, 0)]
  1. #ifndef GLOBAL_H
  2. #define GLOBAL_H
  3. #include <QString>
  4. class Global
  5. {
  6. public:
  7.     Global();
  8.     QString strTest;
  9. };
  10. **global.cpp:**
  11. extern Global myGlobal;
  12. #endif // GLOBAL_H
  13. #include "global.h"
  14. #include <QObject>
  15. Global myGlobal;
  16. Global::Global()
  17. {
  18.     strTest = QObject::tr("Text");
  19. };


测试类:
test.h:[color=rgba(0, 0, 0, 0)]
  1. #ifndef TEST_H
  2. #define TEST_H
  3. #include <QDialog>
  4. namespace Ui {
  5.     class Test;
  6. }
  7. class Test : public QDialog
  8. {
  9.     Q_OBJECT
  10. public:
  11.     explicit Test(QWidget *parent = 0);
  12.     ~Test();
  13. private:
  14.     Ui::Test *ui;
  15. };
  16. #endif // TEST_H

test.cpp:[color=rgba(0, 0, 0, 0)]
  1. #include "test.h"
  2. #include "ui_test.h"
  3. #include "global.h"
  4. Test::Test(QWidget *parent) :
  5.     QDialog(parent),
  6.     ui(new Ui::Test)
  7. {
  8.     ui->setupUi(this);
  9.     //文字还是翻译前的,没有进行更新:
  10.     ui->lbTest->setText(myGlobal.strTest);
  11.     //如果定义一个局部变量,是可以成功显示翻译后的文本,但是这样没用呀,因为这个类变量要是全局的,其它类也要访问和修改:
  12.    //Global test;
  13.     //ui->lbTest->setText(test.strTest);
  14. }
  15. Test::~Test()
  16. {
  17.     delete ui;
  18. }

test.ui:就加一个标签控件,用于显示文本[color=rgba(0, 0, 0, 0)]
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ui version="4.0">
  3. <class>Test</class>
  4. <widget class="QDialog" name="Test">
  5.   <property name="geometry">
  6.    <rect>
  7.     <x>0</x>
  8.     <y>0</y>
  9.     <width>400</width>
  10.     <height>300</height>
  11.    </rect>
  12.   </property>
  13.   <property name="windowTitle">
  14.    <string>Test</string>
  15.   </property>
  16.   <layout class="QGridLayout" name="gridLayout">
  17.    <item row="0" column="0">
  18.     <widget class="QLabel" name="lbTest">
  19.      <property name="text">
  20.       <string/>
  21.      </property>
  22.      <property name="alignment">
  23.       <set>Qt::AlignCenter</set>
  24.      </property>
  25.     </widget>
  26.    </item>
  27.   </layout>
  28. </widget>
  29. <layoutdefault spacing="6" margin="11"/>
  30. <resources/>
  31. <connections/>
  32. </ui>

Main.cpp:[color=rgba(0, 0, 0, 0)]
  1. #include <QtGui/QApplication>
  2. #include "test.h"
  3. #include <QTextCodec>
  4. #include <QTranslator>
  5. QTranslator *myTranslator;
  6. int main(int argc, char *argv[])
  7. {
  8.     QApplication a(argc, argv);
  9.     myTranslator = new QTranslator();
  10.     myTranslator->load(":/test.qm");
  11.     a.installTranslator(myTranslator);
  12.     Test w;
  13.     w.show();
  14.     return a.exec();
  15. }


用Qt Linguist 将文本“Text”翻译成“Update Text”:
编译运行,没有变化,显示的还是原“Text”!
如果在test类中定义局部变量,就会成功,显示的是翻译后的(但是局部的没用,不是我想要的,我需要的是全局的):
期间:
文件编码用GB2312和UTF-8都试过,翻译都无效!
tr编码用GB2312和UTF-8都试过,翻译也都无效!
头疼呀 ,请各位大侠赐教,谢谢!
离线foruok

只看该作者 1楼 发表于: 2014-12-22
你这个是因为,你的全局变量的构造函数,在你installTranslator之前已经被调用了,和Qt的翻译无关。你可以使用单例模式来保存你这些字符串,把对象创建的过程延迟到第一次使用时,这样就没问题了。
或者定义Global的全局指针,在main()函数中new Global出来,new Global放在installTranslator调用后面。
我的博客:http://blog.csdn.net/foruok
我的微信订阅号:程序视界
离线fywz234

只看该作者 2楼 发表于: 2014-12-23
回 foruok 的帖子
foruok:你这个是因为,你的全局变量的构造函数,在你installTranslator之前已经被调用了,和Qt的翻译无关。你可以使用单例模式来保存你这些字符串,把对象创建的过程延迟到第一次使用时,这样就没问题了。
或者定义Global的全局指针,在main()函数中new Global出来,new Global放在instal .. (2014-12-22 17:03) 

回答非常详细,谢谢!已解决
快速回复
限100 字节
 
上一个 下一个