|
小弟写了一个可以管理系统服务信息的软件,主窗口界面上置一列表视图用以显示系统服务的相关信息.主界面窗口类如下:
[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......
篇幅有点长,望高手见谅并赐教,谢谢; |
|