请教:翻译带来的显示问题,QT中QTranslator的使用
小弟写了一个可以管理系统服务信息的软件,主窗口界面上置一列表视图用以显示系统服务的相关信息.主界面窗口类如下:class SrvMainGUI: public MainGUI
{
Q_OBJECT
public:
SrvMainGUI();
~SrvMainGUI();
void refresh_selected_service();
public slots:
virtual void do_runlevel_select(QAction*);
virtual void do_property();
virtual void do_start();
virtual void do_stop();
virtual void do_restart();
virtual void do_refresh(); // 刷新主界面列表视图内容;
virtual void do_exit();
virtual void select_changed(QListViewItem* );
//省略一些获取服务项属性的函数;
private:
ServiceManager *sm; //服务管理器,存储了所有要显示的服务项;
};
程序很简单,在主窗口类的构造函数中读取所有服务项,然后do_refresh()刷新列表视图内数据;
主函数如下所示:
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
SrvMainGUI w;
w.show();
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
return a.exec();
}
此时,程序是正常运行的,把服务项的信息显示于列表视图;
然后,小弟对该程序作汉化,通过lupdate lrelease 等一系列命令后得到SoftService.qm文件,第一次做国际化的事情,至此一切顺利,于是乎飘飘然,接着在主函数中添加翻译类代码如下:
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
SrvMainGUI w;
QTranslator*translator = new QTranslator(0);//定义翻译类
translator->load("SoftService.qm", "."); //加载qm文件
a.installTranslator(translator ); //为应用程序绑定翻译类
w.show();
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
return a.exec();
}
然后 make
./service_manager运行
问题来了,主窗口界面的列表视图中空空如也; 但是根据我设置的调试宏来看,do_refresh()是执行了的,而且服务项的数据确实也读入了sm中,那为什么不显示呢? 诧异之余点击了一下窗口上的工具条上 "刷新"按钮(该按钮触发信号对应的槽是do_refresh() ), 奇迹发生了,列表视图中的各服务项均跃然于屏幕;
深感不解,为什么要手动的刷新一下,数据才会出来呢? 而添加翻译类之前并不需要这么做,难道是翻译类引起的问题???难道这里也存在缓冲的问题,不知道,但个人觉得跟翻译类的显示相关的机制有关,深深的困惑ing......
篇幅有点长,望高手见谅并赐教,谢谢; :cry:
自己顶个先,望各路英雄留步; 补充一下,添加了翻译类之后,汉化功能是完成了的,主界面上的"abc"都按照预期变成了"甲乙丙". 上面的问题已经解决了,把主窗口构件对象的定义 放到翻译类的定义使用之后即可。
更改之后代码如下:
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
// SrvMainGUI w;/*该行代码移至下面*/
QTranslator*translator = new QTranslator(0);//定义翻译类
translator->load("SoftService.qm", "."); //加载qm文件
a.installTranslator(translator ); //为应用程序绑定翻译类
SrvMainGUI w; /*移至此处*/
w.show();
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
return a.exec();
}
这样就解决了数据需要手动刷新才能显示的问题。
这样更改的结论是,应用程序的翻译类必须在主窗口构件生成之前与应用程序绑定,否则将会出现诸如上述的问题,即主窗口上数据不能被及时刷新显示。
我现在还没有去看QTranslator的实现机制,故也不能给出合理的解释。
恳请阅读过QT源码的大虾们能够在此留下您的看法,授道解惑,替像自己一样的菜鸟们在此谢过了。。。 :P 感谢云帆论坛的yunfan的帮助^_^; :mrgreen:
页:
[1]