zoukankan      html  css  js  c++  java
  • Qt程序启动画面播放(gif与swf两种动画格式)

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

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

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

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

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

     1 #include <QtGui>
     2 #include <QtGui/QApplication>
     3 #include <QTextCodec> 
     4 #include <QWidget>
     5 #include <ActiveQt/QAxWidget>
     6 #include <QTime>
     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。网上的例子很多,这里就不描述了,例子中也没加入该功能。

  • 相关阅读:
    华为云垃圾分类大赛,让AI 帮你“见圾行事”
    【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式
    Ubuntu 配置网卡信息
    配置 Mysql 支持远程访问 并取消域名解析以提高链接速度
    jQuery 操作 html5 data-* 属性
    Laravel 中使用原生的 PHPExcel
    Laravel 上使用 phpexcel的两种方式
    debian中默认不存在sudo命令解决方法
    composer install 时,提示:Package yiisoft/yii2-codeception is abandoned, you should avoid using it. Use codeception/codeception instead.的解决
    Linux 磁盘分区存放文件和目录的数量 (inode)
  • 原文地址:https://www.cnblogs.com/tgyf/p/3854695.html
Copyright © 2011-2022 走看看