项目组的程序是一个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不会退出程序,这个有待解决,还望高手指点。
        这是我第一次写博客,有点小激动,写的可能会有问题,还请各位指出和包含~~