中国Linux公社论坛's Archiver

TracyM 发表于 2006-7-28 20:53

请教:翻译带来的显示问题,QT中QTranslator的使用

小弟写了一个可以管理系统服务信息的软件,主窗口界面上置一列表视图用以显示系统服务的相关信息.主界面窗口类如下:
[code:1]
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; //服务管理器,存储了所有要显示的服务项;

};
[/code:1]

程序很简单,在主窗口类的构造函数中读取所有服务项,然后do_refresh()刷新列表视图内数据;
主函数如下所示:
[code:1]
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();
}[/code:1]

此时,程序是正常运行的,把服务项的信息显示于列表视图;
然后,小弟对该程序作汉化,通过lupdate lrelease 等一系列命令后得到SoftService.qm文件,第一次做国际化的事情,至此一切顺利,于是乎飘飘然,接着在主函数中添加翻译类代码如下:

[code:1]
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();

}[/code:1]

然后 make
./service_manager  运行
问题来了,主窗口界面的列表视图中空空如也; 但是根据我设置的调试宏来看,do_refresh()是执行了的,而且服务项的数据确实也读入了sm中,那为什么不显示呢? 诧异之余点击了一下窗口上的工具条上 "刷新"按钮(该按钮触发信号对应的槽是do_refresh() ), 奇迹发生了,列表视图中的各服务项均跃然于屏幕;
深感不解,为什么要手动的刷新一下,数据才会出来呢? 而添加翻译类之前并不需要这么做,难道是翻译类引起的问题???难道这里也存在缓冲的问题,不知道,但个人觉得跟翻译类的显示相关的机制有关,深深的困惑ing......

篇幅有点长,望高手见谅并赐教,谢谢;

TracyM 发表于 2006-7-28 20:55

:cry:
自己顶个先,望各路英雄留步;

TracyM 发表于 2006-7-28 21:00

补充一下,添加了翻译类之后,汉化功能是完成了的,主界面上的"abc"都按照预期变成了"甲乙丙".

TracyM 发表于 2006-7-30 15:06

上面的问题已经解决了,把主窗口构件对象的定义 放到翻译类的定义使用之后即可。
更改之后代码如下:
[code:1]
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();

}

[/code:1]

这样就解决了数据需要手动刷新才能显示的问题。
这样更改的结论是,应用程序的翻译类必须在主窗口构件生成之前与应用程序绑定,否则将会出现诸如上述的问题,即主窗口上数据不能被及时刷新显示。
我现在还没有去看QTranslator的实现机制,故也不能给出合理的解释。
恳请阅读过QT源码的大虾们能够在此留下您的看法,授道解惑,替像自己一样的菜鸟们在此谢过了。。。 :P

TracyM 发表于 2006-7-30 19:49

感谢云帆论坛的yunfan的帮助^_^;

KDE 发表于 2006-8-12 07:26

:mrgreen:

页: [1]

Powered by Discuz! Archiver 6.1.0F  © 2001-2007 Comsenz Inc.