网上找了许久资料,发现都是不行的,其中一个帖子
http://www.cnblogs.com/tlsdba/archive/2012/06/27/2565559.html
给了我一些思路,不过这上面明显是错误的,多线程里面不要有界面的东西,编译器会给警报的,我用上面的例子是直接异常结束掉了。
大体上的错误也是
QPixmap: It is not safe to use pixmaps outside the GUI thread
ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel/qwidget.cpp, line 1299
然后自己按照这个思路,使用QTimer利用信号和槽进行显示gif图,这样,gif图既可以动,程序又能加载本应该加载的东西。
代码很简单,我还是直接上代码吧!不过有一个小问题是,Sleep和timeout的时间一样,可是gif要停0.几秒才会自己消失,也许是因为信号-槽机制的原因吧!
至于显示gif图有个关闭按钮,这个就不是本文讨论的范畴了,可以自己去重写一下界面撒
MainView.h:
#ifndef MAINVIEW_H
#define MAINVIEW_H
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
#include <windows.h>
#include <QApplication>
#include <QTimer>
class MainView : public QWidget
{
Q_OBJECT
public:
explicit MainView(QWidget *parent = 0);
QGridLayout *main;
QPushButton *btn;
signals:
void signals_WakeupApp();
public slots:
private slots:
void slots_StopStartup();
void slots_WakeupApp();
private:
bool startupIsOver;
};
#endif // MAINVIEW_H
#include "MainView.h"
#include <QDebug>
MainView::MainView(QWidget *parent) :
QWidget(parent)
{
startupIsOver = false;
main = new QGridLayout(this);
btn = new QPushButton(tr("Just Button"));
main->addWidget(btn, 0, 0);
connect(this, SIGNAL(signals_WakeupApp()), this, SLOT(slots_WakeupApp()));
emit signals_WakeupApp();
Sleep(3000);
}
void MainView::slots_StopStartup()
{
startupIsOver = true;
}
void MainView::slots_WakeupApp()
{
QTimer t;
connect(&t ,SIGNAL(timeout()), this, SLOT(slots_StopStartup()));
t.start(3000);
while(!startupIsOver)
{
QApplication::processEvents();
}
}
Main.cpp
#include <QApplication>
#include <QPixmap>
#include <QSplashScreen>
#include <QLabel>
#include <QMovie>
#include "MainView.h"
int main(int argc, char *argv[])
{
/*显示jpg的代码*/
// QApplication a(argc, argv);
// QPixmap pixmap("1.gif");
// QSplashScreen splash(pixmap);
// splash.show();
// MainView view;
// view.show();
// splash.finish(&view);
// return a.exec();
/*显示gif代码*/
QApplication app(argc, argv);
QMovie *movie;
movie=new QMovie("1.gif");
QLabel *label=new QLabel ("", 0); //初始化qlabel;
label->setGeometry( 300, 300, 493, 150 );
label->setMovie(movie);
label->setScaledContents(true);
movie->start();
label->show();
MainView w;
w.show();
label->close();
return app.exec();
}