项目组的程序是一个3D的虚拟航海,由于模型很大,所以在每次载入的时候都会等待很长的时间,每次都只能死等,还会以为程序死掉,用户友好度不高,所以想在载入的时候播放一个gif图做为载入画面,当然这个gif图没有记录载入进度的功能。。。
在网上搜了相关资料,发现只有关于怎样播放gif的文章,最有用的只有讨论到说“当程序启动的时候线程正在执行一些初始化操作,无法处理QMovie的events,所以只会显示第一帧的画面,解决方法是适当的调用qApp->processEvents();可以处理事件”。
但是如果不用多线程,执行到
DKOcean* w = new DKOcean();
w->Create(1024,768,shipNumber);//创建3D场景模型
create的时候程序gif图还是会卡住。
所以我觉得尝试一下多线程来处理gif图的播放(怎样播放gif图已经有人讨论过了,这里就不说明)~下面贴出代码:
首先是gifThread.h:
#ifndef GIFTHREAD_H #define GIFTHREAD_H #include <QThread> class Thread : public QThread { Q_OBJECT public: Thread(); void stop();//当主程序载入成功后调用,结束线程 protected: void run(); private: volatile bool stopped; }; #endif
然后是gifThread.cpp:
#include <QtCore> #include <iostream> #include "gifThread.h" #include <QMovie> #include <QLabel> //#include <QtGui/QMainWindow> Thread::Thread() { stopped = false;//初始化为false ,可以执行qApp->processEvents();播放gif图 } void Thread::run() { QMovie *movie; movie=new QMovie("Resources/Gui/loading.gif"); QLabel *label=new QLabel ("", 0); //初始化qlabel; label->setGeometry( 300, 300, 493, 150 ); label->setMovie(movie); label->setScaledContents(true); movie->start(); label->show(); while(!stopped) qApp->processEvents(); label->close(); } void Thread::stop() { stopped = true; }
最后是在主程序里面,按钮按下触发载入事件,gui.cpp:
void GUI::on_pushButton_excute_clicked() { QApplication::addLibraryPath("./plugins"); this->close();//关闭当前窗口 threadA.start(); //Thread threadA; DKOcean* w = new DKOcean(); w->Create(1024,768,shipNumber); w->show(); threadA.stop(); }
最后还有个小问题是载入的时候关闭label不会退出程序,这个有待解决,还望高手指点。
这是我第一次写博客,有点小激动,写的可能会有问题,还请各位指出和包含~~