[) 學習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,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();}新聞熱點
疑難解答