学习Qt有一段时间了,发现一个小问题,网上关于Qt的资料或者总结性的学习及应用文章有点少。

  比如,Qt完整的API,程序运行之前的启动画面如何按理想效果播放等,每次想在项目中添加一些应用的时候,总是找不到好的书籍或文章可以马上学习、上手。

  今天,就把前段时间对启动画面播放的学习及尝试做一个小小的总结。如果对大家有所帮助,那自然好;如果有什么不足或有什么可以改进的地方,还望朋友们多给点意见及建议,谢谢!

  过程很简单,只是建立了一个基于Qt控制台的项目,文件也只有一个——"main.cpp"。

  直接上代码,注意如果要播放Flash动画需要引入QAxWidget类,库文件有QAxContainer.lib,QAxServer.lib等。

 #include <QtGui>
#include <QtGui/QApplication>
#include <QTextCodec>
#include <QWidget>
#include <ActiveQt/QAxWidget>
#include <QTime> void gifplay(QLabel *label)
{
label->show();
} void gifclose(QLabel *label)
{
label->close();
} void flashplay(QAxWidget *flash)
{
flash->show();
} void flashclose(QAxWidget *flash)
{
flash->close();
} int main(int argc, char *argv[])
{
QApplication a(argc, argv); QTextCodec *codec = QTextCodec::codecForName("GB2312"); //文本为GB2312编码
QTextCodec::setCodecForLocale(codec); //设置本地编码
QTextCodec::setCodecForCStrings(codec); //设置字符串编码
QTextCodec::setCodecForTr(codec); QAxWidget *flash = new QAxWidget(,); //QAxWidget使用的是ActiveX插件
flash->resize(,); //设置该控件的初始大小
flash->setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-444553540000}")); //设定控制器
flash->dynamicCall("LoadMovie(long,string)",,"D:\\flash1.swf"); //
flash->setWindowFlags(Qt::FramelessWindowHint); //去除边框
flashplay(flash);
QTime t;
t.start();
while(t.elapsed()<)
{
QApplication::processEvents();
}
flashclose(flash); /*
QMovie *movie;
movie = new QMovie("D:\\gif1.gif");
QLabel *label=new QLabel ("", 0);
label->setGeometry( 300, 300, 500, 500 );
label->setMovie(movie);
label->setScaledContents(true);
movie->start();
gifplay(label);
t.start();
while(t.elapsed()<5000)
{
QApplication::processEvents();
}
gifclose(label);
*/ return a.exec();
}

  程序开头做了一些初始化工作,这里就不解释了,有兴趣的朋友可以细细研究下。

  关键的代码分为两段,前一段是针对Flash动画".swf";后一段注释的是针对".gif"。

  先看第一段,从37行开始,分别为声明QAxWidget类指针,设置播放画面大小及控制类别,然后导入需要播放的文件,最好是绝对路径。语句flash->setWindowFlags(Qt::FramelessWindowHint);作用是去除播放时的边框,因为我的目的是播放程序启动画面,去除边框会美观一点,而且其会自动关闭,不需要关闭等按钮。

  分别给动画播放和关闭定义了独立方法,虽然也可以直接在主函数中播放和关闭,但为了体现封装思想以及方面日后添加新功能,还是方法的形式比较易用。

  关键的是接下来时间设置的部分,因为动画在Qt控件中播放不会自动关闭,而且,若是简单地设置等待多少时间然后关闭动画,那么程序在等待的过程中,动画也不会正常播放,这也是原先头疼及花时间最多的地方。

  用到了QTime类,开始计时之后,通过elapsed()函数获取走过时间,若是没到设定时长,就继续原先进程,即继续播放动画,例子中设定的是5000毫秒。

 QTime t;
t.start();
while(t.elapsed()<)
{
QApplication::processEvents();
}

  到此,Flash的".swf"动画播放及自动关闭功能就实现了,是不是很简单。

  注释掉的那一段是播放".gif"动画的,原理及实现方式类似,只是播放控件不同,用了最常规的QLabel。

  这个例子是经过反复测试的,能成功运行并达到理想效果,用的工具是VS2008+Qt4.8.6。

  在实际项目中,有些主界面打开会需要花点时间,为了不让用户有等待的感觉,可以将一小段动画加在启动时段,所以对这方面的学习还是值得与有应用场景的

  至于静态图像作为启动画面,就更简单了,Qt也有一个很好用的类——QSplashScreen。网上的例子很多,这里就不描述了,例子中也没加入该功能。

Qt程序启动画面播放(gif与swf两种动画格式)的更多相关文章

  1. QSplashScreen类实现Qt程序启动画面

      QSplashScreen类实现Qt程序启动画面 收藏人:zwsj     2013-09-13 | 阅:569  转:6    |   来源   |  分享               程序启动 ...

  2. qt程序启动画面

  3. qt程序启动播放动画

    qt程序启动播放动画 编辑删除转载 2016-01-20 10:23:11 标签:qt启动动画 1.播放动画 QAxWidget *flash = , ); //QAxWidget使用的是Active ...

  4. QT之实现程序启动画面

    现在好多软件都有,尤其是大型软件,他们要加载的东西太多,因此需要的事件较长,而又不希望给用户产生成为好像没有响应的情况,因此也就需要程序启动画面来实现. 当然了,用widget要比这个丰富很多,不过代 ...

  5. 用VC制作应用程序启动画面

    摘 要:本文提供了四种启动画面制作方法. 使用启动画面一是可以减少等待程序加载过程中的枯燥感(尤其是一些大型程序):二是 可以用来显示软件名称和版权等提示信息.怎样使用VC++制作应用程序的启动画面呢 ...

  6. MFC之窗体改动工具栏编程状态栏编程程序启动画面

    1窗体外观的改动 (1)改动在CMainFrame::preCreateWindow(CREATESTRUCT& cs) 改动标题:cs.style&=FWS_ADDTOTITLE; ...

  7. 嵌入式Qt程序启动参数-qws 不需要X11桌面系统

    1 背景 通过串口终端启动arm开发板(linux系统)的Qt应用程序,提示: [root@FORLINX6410]# /opt/qt-4.7.1/demos/textedit/textedit s3 ...

  8. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  9. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

随机推荐

  1. php 修改上传文件大小 (max_execution_time post_max_size)

    有些朋友要通过自己的网站后台,包括论坛,来上传一些文件,php一般为2m,或8m(以下我们按默认为2m),接下来就是来讲怎么修改上传文件大小的. 1.首先修改执行上传文件限制 一般的文件上传,除非文件 ...

  2. spring ioc DI 理解

    下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversi ...

  3. 汇编中call printf参数压栈时错误理解

    EAX, ECX,EDX,EBX均可以32bit,16bit,8bit访问,如下所示: <-------------------EAX------------------------>|& ...

  4. dotnet use regex two samples

    One sample is used to replace double quote from words which encapsulated by csvwriter , you know csv ...

  5. javaScript事件(三)事件对象

    一.事件 二.事件流 以上内容见:javaScript事件(一)事件流 三.事件处理程序 四.IE事件处理程序 以上内容见javaScript事件(二)事件处理程序 五.事件对象 1.认识事件对象 事 ...

  6. JVM 类加载过程

    类从加载到虚拟机到卸载,它的整个生命周期包括:加载(Loading),验证(Validation),准备(Preparation),解析(Resolution),初始化(Initialization) ...

  7. [转载]两个半小时学会Perl

    Learn Perl in about 2 hours 30 minutes By Sam Hughes Perl is a dynamic, dynamically-typed, high-leve ...

  8. hdu 5861 Road 两棵线段树

    传送门:hdu 5861 Road 题意: 水平线上n个村子间有 n-1 条路. 每条路开放一天的价格为 Wi 有 m 天的操作,每天需要用到村子 Ai~Bi 间的道路 每条路只能开放或关闭一次. ( ...

  9. Properties集合的练习

    1.更改文件中的数据,特定键的值: 需求:我有一个文本文件(user.txt),我知道数据是键值对形式的,但是不知道内容是什么. 请写一个程序判断是否有"lisi"这样的键存在,如 ...

  10. Mybaits学习总结1

    http://www.cnblogs.com/xdp-gacl/p/4261895.html 参考了这篇文章搭建了Mybaits环境,原作者有些地方没有标注使用某种编码,我是自学SQL的,所以深知编码 ...