生活随笔
收集整理的這篇文章主要介紹了
在QT搭建的播放器外壳中嵌入SDL的窗口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[cpp] view plaincopy print?
<span?style="font-family:?Arial,?Verdana,?sans-serif;?white-space:?normal;?background-color:?rgb(255,?255,?255);?">用的是widnowsXP的系統。給播放器中加入SDL的窗口的目的是為了播放視頻,為了使用ffmpeg。</span>?? 當然了直接用QT+ffmpeg也可以,不過我目前還不會。而且QT就是個殼,SDL+ffmpeg才是想要表達的重點。
因為GTK+SDL+ffmpeg也是可以的。
windows上的Unix環境用的是MinGW,把SDL的庫裝到這個mingw目錄下,對應的lib和include,跟Linux下面一樣。
然后在QT的creator里就可以用-lSDL這種了,并且可以包含<SDL/SDL.h>了。如果不行,看看環境變量里面的路徑什么的包含對了么。
程序就是基于上一篇播放器的外殼進行增加的。增量式開發,~增一點測試一點~安全第一~~O(∩_∩)O~
主要是對于MyWindow那個class里面增加方法,也就是函數,然后在構造函數中調用函數來初始化SDL的窗口。
如何關聯QT的widget和SDL的窗口是個關鍵,說實話沒有好的辦法,SDL的官網上也是用的這種很山寨的辦法,就是提供什么窗口ID。
[cpp] view plaincopy print?
SDL_Surface?*pSDLSurface;????void?MyWindow::CreateSDLWindow(void)??{??????QWidget?*widget?=?ui->SDLWindow;????????{??????????char?winID[32]?=?{0};??????????????????QSize?size?=?ui->SDLWindow->baseSize();????????????sprintf(winID,?"SDL_WINDOWID=0x%lx",?(long?unsigned?int)widget->winId());????????????SDL_putenv(winID);????????????if?(SDL_Init(SDL_INIT_VIDEO?|?SDL_INIT_AUDIO?|?SDL_INIT_TIMER))?{??????????????qDebug("Cannot?initialize?SDL.");??????????}????????????pSDLSurface?=?SDL_SetVideoMode(size.width(),?size.height(),?0,?SDL_HWSURFACE);??????????if?(!pSDLSurface)?{??????????????qDebug("SDL?Cannot?set?video?mode");??????????}??????}??}??
看到了沒,一個sprintf把一句
[cpp] view plaincopy print?
SDL_WINDOWID=0x%lx?? 給賦值了,然后用SDL_putenv來給了環境變量,話說我是真不知道這個東西怎么傳遞的,而且在Linux下還是用的putenv()的函數。~~所謂的hack方法。
搞完了這個之后,運行程序就會看到原來灰白色的主窗口現在變成了黑色的。說明~成功了,下一步就可以在這個上面用一些SDL的東西來搞搞了。
最后把代碼都貼上來吧,沒改動的就算了。
mainwidnow.h
[cpp] view plaincopy print?
#ifndef?MAINWINDOW_H??#define?MAINWINDOW_H????#include?<QMainWindow>??#include?<QFileDialog>??#include?<QMessageBox>??#include?<stdio.h>??#include?<SDL/SDL.h>????#define?FILE_NAME_LENGTH????128????extern?SDL_Surface?*pSDLSurface;????namespace?Ui?{??????class?MyWindow;??}????class?MyWindow?:?public?QMainWindow??{??????Q_OBJECT????public:??????explicit?MyWindow(QWidget?*parent?=?0);??????~MyWindow();??????????int??getPlayState(void);??????????void?setPlayState(int?i);????private:??????Ui::MyWindow?*ui;??????????int??iPlayPause;??????????char?caFileName[FILE_NAME_LENGTH];????????????void?SaveFileName(QString?file);??????????char?*GetFileName(void);????????void?CreateSDLWindow(void);????public?slots:??????????void?SlotsBackward(void);??????????void?SlotsForward(void);??????????void?SlotsPlayPause(void);??????????void?SlotsStop(void);??????????void?SlotsOpenFile(void);??};????#endif?//?MAINWINDOW_H??
mainwindow.cpp
[cpp] view plaincopy print?
#include?"mainwindow.h"??#include?"ui_mywindow.h"????MyWindow::MyWindow(QWidget?*parent)?:??????QMainWindow(parent),??????ui(new?Ui::MyWindow)??{??????ui->setupUi(this);????????Qt::WindowFlags?flags?=?0;??????flags?|=?Qt::WindowMinimizeButtonHint;?????setWindowFlags(flags);??????????????setFixedSize(400,450);???????iPlayPause?=?0;??????connect(ui->Backward,???SIGNAL(clicked()),?this,?SLOT(SlotsBackward()));??????connect(ui->Forward,????SIGNAL(clicked()),?this,?SLOT(SlotsForward()));??????connect(ui->PlayPause,??SIGNAL(clicked()),?this,?SLOT(SlotsPlayPause()));??????connect(ui->Stop,???????SIGNAL(clicked()),?this,?SLOT(SlotsStop()));??????connect(ui->OpenFile,???SIGNAL(clicked()),?this,?SLOT(SlotsOpenFile()));????????CreateSDLWindow();??}????MyWindow::~MyWindow()??{??????delete?ui;??}????void?MyWindow::SlotsBackward(void)??{??????qDebug("Backward");??}????void?MyWindow::SlotsForward(void)??{??????qDebug("Forward");??}??????void?MyWindow::SlotsPlayPause(void)??{??????if?(getPlayState()==0)?{??????????qDebug("Play:?%s",?GetFileName());??????????setPlayState(1);??????}?else?{??????????qDebug("Pause");??????????setPlayState(0);??????}??}????void?MyWindow::SlotsStop(void)??{??????qDebug("Stop");??}????int?MyWindow::getPlayState(void)??{??????return?iPlayPause;??}????void?MyWindow::setPlayState(int?i)??{??????iPlayPause?=?i;??}????void?MyWindow::SlotsOpenFile(void)??{??????qDebug("Open?File");??????QFileDialog?*fd?=?new?QFileDialog(this);??????fd->setModal(QFileDialog::ExistingFile);????????fd->setViewMode(QFileDialog::Detail);???????????fd->setFilter("Video?(*.mpeg?*.avi)");??????????if?(fd->exec()?==?QDialog::Accepted)?{??????????QString?file?=?fd->selectedFiles()[0];??????????????????SaveFileName(file);??????}??}????void?MyWindow::SaveFileName(QString?file)??{??????memset(caFileName,?0,?FILE_NAME_LENGTH);??????strcpy(caFileName,?file.toAscii().data());??}????char*?MyWindow::GetFileName(void)??{??????return?caFileName;??}??????SDL_Surface?*pSDLSurface;????void?MyWindow::CreateSDLWindow(void)??{??????QWidget?*widget?=?ui->SDLWindow;????????{??????????char?winID[32]?=?{0};??????????????????QSize?size?=?ui->SDLWindow->baseSize();????????????sprintf(winID,?"SDL_WINDOWID=0x%lx",?(long?unsigned?int)widget->winId());????????????SDL_putenv(winID);????????????if?(SDL_Init(SDL_INIT_VIDEO?|?SDL_INIT_AUDIO?|?SDL_INIT_TIMER))?{??????????????qDebug("Cannot?initialize?SDL.");??????????}????????????pSDLSurface?=?SDL_SetVideoMode(size.width(),?size.height(),?0,?SDL_HWSURFACE);??????????if?(!pSDLSurface)?{??????????????qDebug("SDL?Cannot?set?video?mode");??????????}??????}??}
總結
以上是生活随笔為你收集整理的在QT搭建的播放器外壳中嵌入SDL的窗口的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。