zoukankan      html  css  js  c++  java
  • Qt 在程序启动的时候用多线程实现播放gif动画

            项目组的程序是一个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不会退出程序,这个有待解决,还望高手指点。
            这是我第一次写博客,有点小激动,写的可能会有问题,还请各位指出和包含~~
  • 相关阅读:
    模态对话框
    js小练习题
    js练习题
    python实现不同格式九九乘法表
    Python学习笔记之疑问12:什么是tuple
    Python学习笔记之疑问11:批量赋值
    Python学习笔记之疑问10:如何使用分隔符连接list中的字符串
    Python学习笔记之疑问 9:如何使用For语句
    Python学习笔记之疑问 8:Python 中的问号表达式
    Python学习笔记之疑问 7:自定义模块放在什么位置
  • 原文地址:https://www.cnblogs.com/tlsdba/p/2565559.html
Copyright © 2011-2022 走看看