日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

在QT搭建的播放器外壳中嵌入SDL的窗口

發布時間:2025/7/14 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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對象,作為一塊graphical?memory存在,用于進行繪制?*/??
  • SDL_Surface?*pSDLSurface;??
  • ??
  • /*?把一個QT的窗口交給SDL使用?*/??
  • 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);??
  • ????//QSize?size?=?ui->MyScreen->baseSize();??
  • ????//setFixedSize(size.width(),size.height());??
  • ????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;??
  • }??
  • ??
  • /*?與OPEN按鈕關聯的動作,顯示文件選擇對話框,讓用戶選擇想要打開的文件?*/??
  • 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];??/*?取得選擇的文件,包括了絕對路徑?*/??
  • ????????//qDebug(file.toAscii().data());??
  • ????????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對象,作為一塊graphical?memory存在,用于進行繪制?*/??
  • SDL_Surface?*pSDLSurface;??
  • ??
  • /*?把一個QT的窗口交給SDL使用?*/??
  • 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的窗口的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。