[转载原文:]
(http://www.cnblogs.com/tgyf/p/3854695.html)
学习Qt有一段时间了,发现一个小问题,网上关于Qt的资料或者总结性的学习及应用文章有点少。
比如,Qt完整的API,程序运行之前的启动画面如何按理想效果播放等,每次想在项目中添加一些应用的时候,总是找不到好的书籍或文章可以马上学习、上手。
今天,就把前段时间对启动画面播放的学习及尝试做一个小小的总结。如果对大家有所帮助,那自然好;如果有什么不足或有什么可以改进的地方,还望朋友们多给点意见及建议,谢谢!
过程很简单,只是建立了一个基于Qt控制台的项目,文件也只有一个——”main.cpp”。
直接上代码,注意如果要播放Flash动画需要引入QAxWidget类,库文件有QAxContainer.lib,QAxServer.lib等。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7
8 void gifplay(QLabel *label)
9 {
10 label->show();
11 }
12
13 void gifclose(QLabel *label)
14 {
15 label->close();
16 }
17
18 void flashplay(QAxWidget *flash)
19 {
20 flash->show();
21 }
22
23 void flashclose(QAxWidget *flash)
24 {
25 flash->close();
26 }
27
28 int main(int argc, char *argv[])
29 {
30 QApplication a(argc, argv);
31
32 QTextCodec *codec = QTextCodec::codecForName("GB2312"); //文本为GB2312编码
33 QTextCodec::setCodecForLocale(codec); //设置本地编码
34 QTextCodec::setCodecForCStrings(codec); //设置字符串编码
35 QTextCodec::setCodecForTr(codec);
36
37 QAxWidget *flash = new QAxWidget(0,0); //QAxWidget使用的是ActiveX插件
38 flash->resize(800,600); //设置该控件的初始大小
39 flash->setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-444553540000}")); //设定控制器
40 flash->dynamicCall("LoadMovie(long,string)",0,"D:\\flash1.swf"); //
41 flash->setWindowFlags(Qt::FramelessWindowHint); //去除边框
42 flashplay(flash);
43 QTime t;
44 t.start();
45 while(t.elapsed()<5000)
46 {
47 QApplication::processEvents();
48 }
49 flashclose(flash);
50
51 /*
52 QMovie *movie;
53 movie = new QMovie("D:\\gif1.gif");
54 QLabel *label=new QLabel ("", 0);
55 label->setGeometry( 300, 300, 500, 500 );
56 label->setMovie(movie);
57 label->setScaledContents(true);
58 movie->start();
59 gifplay(label);
60 t.start();
61 while(t.elapsed()<5000)
62 {
63 QApplication::processEvents();
64 }
65 gifclose(label);
66 */
67
68 return a.exec();
69 }
程序开头做了一些初始化工作,这里就不解释了,有兴趣的朋友可以细细研究下。
关键的代码分为两段,前一段是针对Flash动画”.swf”;后一段注释的是针对”.gif”。
先看第一段,从37行开始,分别为声明QAxWidget类指针,设置播放画面大小及控制类别,然后导入需要播放的文件,最好 是绝对路径。语句flash->setWindowFlags(Qt::FramelessWindowHint);作用是去除播放时的边框,因为我的目的是播放程序启动画面,去除边框会美观一点,而且其会自动关闭,不需要关闭等按钮。
分别给 动画 播放和关闭定义了独立方法,虽然也可以直接在主函数中播放和关闭,但为了体现封装思想以及方面日后添加新功能,还是方法的形式比较易用。
关键的是接下来时间设置的部分,因为动画在Qt控件中播放不会自动关闭,而且,若是简单地设置等待多少时间然后关闭动画,那么程序在等待的过程中,动画也不会正常播放,这也是原先头疼及花时间最多的地方。
用到了QTime类,开始计时之后,通过elapsed()函数获取走过时间,若是没到设定时长,就继续原先进程,即继续播放动画,例子中设定的是5000毫秒。
1 QTime t;
2 t.start();
3 while(t.elapsed()<5000)
4 {
5 QApplication::processEvents();
6 }
到此,Flash的”.swf”动画播放及自动关闭功能就实现了,是不是很简单。
注释掉的那一段是播放”.gif”动画的,原理及实现方式类似,只是播放控件不同,用了最常规的QLabel。
这个例子是经过反复测试的,能成功运行并达到理想效果,用的工具是VS2008+Qt4.8.6。
在实际项目中,有些主界面打开会需要花点时间,为了不让用户有等待的感觉,可以将一小段动画加在启动时段,所以对这方面的学习还是值得与有应用场景的
至于静态图像作为启动画面也很简单,Qt有很好用的类:QSplashScreen,QPixmap。例子如下:
------------main.cpp-------------------
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb2312"));//设置本地编码
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gb2312"));//设置字符串编码
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));
QPixmap pixmap(".../images/Splash.PNG");
QSplashScreen splash(pixmap);
splash.show();
QTime t;
t.start();
while(t.elapsed()<5000)
{
QApplication::processEvents();
}
MainWindow w;
w.show();
splash.finish(&w);
return app.exec();
}