2008年12月27日星期六

setCentralWidget使用嵌入SDL的Qt Widget?

以前讨论了SDL嵌入Qt Widget, 比较规范的方法是,我在以前的文章里已经提过了:  

char variable[64]; 
_snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId()); 
SDL_putenv(variable); 

这里只使用了三行程序,很简单,唯一要注意的一点:不要使用effectiveWinId (),而是要使用winId ()。
现在我们要使用这个已经嵌入SDL的Qt Widget, 我做了两个测试:


测试1:在MainWindow中使用setCentralWidget

SDLVideo *sdlvideo = new SDLVideo; 
setCentralWidget(sdlvideo); 


结果:无法成为MainWindow的CentralWidget,程序执行一下就立刻结束。测试2:在MainWindow中使用QDockWidget 

SDLVideo *SDLVideo_dock = new SDLVideo; 
QDockWidget *dock_a = new QDockWidget(tr("Media Player of ... ..."), this); 
dock_a->setWidget(SDLVideo_dock); 
//addDockWidget(Qt::LeftDockWidgetArea, dock_a); 
viewMenu->addAction(dock_a->toggleViewAction()); 

结果:和预料的一样,也无法成为MainWindow的QDockWidget,程序执行一下就立刻结束。
结论:经过两个测试证明,SDL嵌入Qt Widget,在一定程度上不能和一般的Qt Widget一样工作,虽然现在它也是Widget但是它只是一个“类Qt Widget”,一定程度上也是一个SDL app,它只是嵌入一个Qt Widget。原因是winid的返回值的问题,在windows下会有点问题,在linux下以上的程序应该就没有问题。

没有评论: