2008年11月30日星期日

Qt 及SDL

Qt部分:
可以把 QWidget包成一個QDockWidget的子类,进而加到QDockWidget中,例如:

SDLVideo *SDLVideo_dock = new SDLVideo; 
QDockWidget *dock_4 = new QDockWidget(tr("Media Player of Online Tool of Robotic Experiment"), this); 
dock_4->setWidget(SDLVideo_dock); // 重点:把 QWidget包成一個QDockWidget的子类 
addDockWidget(Qt::LeftDockWidgetArea, dock_4); 
viewMenu->addAction(dock_4->toggleViewAction()); 

再介绍两个有趣的函数:

setAttribute(Qt::WA_PaintOnScreen);//这个函数可以给屏幕截图 
setUpdatesEnabled(false);//可以决定是否对Widget截的图是否可以Update 

SDL部分:

putenv("SDL_VIDEODRIVER=directx"); 

注意:这个函数必须用在SDL_Init();之前才有实际效果。来设置为directx环境。(VC下为了解除编译警告,也可使用SDL_putenv()来代替putenv(),效果都一样。)

以下程序实例--让SDL结合在Qt Widget里,摘自:http://www.guiadohardware.net/comunidade/showthread.php?t=797107
我试了,可以用,但是还不是很完美的解决方案。
如何用SDL创建一个窗口: 一个台湾网友的LinuxGame的博客,中文说明http://otlinux.blogspot.com/2007_12_01_archive.html

英文版http://www.aaroncox.net/tutorials/2dtutorials/sdlwindow.html

如何让SDL嵌入到Qt的Widget里,使用:QWidget::winId()
至今为止,最好的解决方案。例1: http://listas.apesol.org/pipermail/sdl-libsdl.org/2005-September/051604.html

#define NEED_SDL_GETENV 
#include 
//.... 
char variable[256]; 
sprintf(variable, "SDL_WINDOWID=0x%lx", winId()); 
if (SDL_putenv(variable) == -1) 
{ 
// .... 
}

例2:http://stackoverflow.com/questions/118659/how-do-i-use-qt-and-sdl-together

// Set the new video mode with the new window size 
char variable[64]; 
snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId()); 
putenv(variable); 
// ffmpeg is relatively simple. 
// A while back, I used the page below as a reference 
// and coded up a simple app that uses ffmpeg to decode frames 
// and paints them on screen in a QWidget. 

http://www.inb.uni-luebeck.de/~boehme/libavcodec_update.html

没有评论: