Qt调用SDL的问题

hjl0508 2014-12-30 02:21:59
我将SDL嵌入Qt中来做一个YUV播放器,这里需要将Qt的标题栏和边框隐藏,可是当我将边框隐藏后Qt界面会有一部分失效,或者Qwebview加载网页的时候特别卡,有人碰到过这种情况吗?
我发现加载SDL和隐藏边框的代码同时存在就会有各种问题,比如Qt界面上面一条失效(在有的机器上没事),就是我自己写的最小化和关闭按钮就会失效,因为我写了整个页面的拖动事件,失效就是最上面有一块区域拖动无效,给我的感觉就像多了一个标题栏把那一块盖住了似的,或者旁边一个webview加载网页会特别卡。
有人碰到过这种情况吗?求解答

//这是隐藏边框的代码
this->setWindowFlags(Qt::FramelessWindowHint);
//下面是将SDL嵌入Qt控件中的代码
void MainWindow::CreateSDLWindow()
{
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");
}
atexit(SDL_Quit);
pSDLSurface = SDL_SetVideoMode(size.width(),size.height(),0,SDL_HWSURFACE|SDL_ANYFORMAT);
if(!pSDLSurface)
{
qDebug("SDL Cannot set video mode");
}
}
//MainWindow *mainw=new MainWindow(this);

}
...全文
648 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjl0508 2015-01-04
  • 打赏
  • 举报
回复
引用 12 楼 ganjianh8 的回复:
还有,用SDL2吧,不要用SDL1.x版本了,SDL2的接口更好用,不用设外部环境变量
我想了想这不是用SDL1.2.X还是2.0的问题,因为我还有一个窗口要显示页面,所以必须得把SDL嵌入一个窗口中,这样就需要将winId和SDL连起来,还是得解决winId()和setWindowFlags(Qt::FramelessWindowHint)冲突的问题。。。
hjl0508 2014-12-31
  • 打赏
  • 举报
回复
额,上面忘了贴图
hjl0508 2014-12-31
  • 打赏
  • 举报
回复
引用 3 楼 openXMPP 的回复:
你能贴个图看看效果吗 Qt自己绘图的时候是有个层次的
如图,上面红色部分就是失效的部分,那个加载网页的框是和左边的黑框一样大小的,在我本机界面加载的时候就是那个红框的部分会有一个类似按钮形状的东西一闪,但是在我本机是没问题的,在有的电脑上红框那一部分里面的东西就会失效,就像被盖住了。但是能看到那些按钮,只是不管用,可是取消掉隐藏边框那个代码或者去掉加载SDL的代码,就没问题了。
乔巴好萌 2014-12-31
  • 打赏
  • 举报
回复
你能贴个图看看效果吗 Qt自己绘图的时候是有个层次的
hjl0508 2014-12-31
  • 打赏
  • 举报
回复
引用 1 楼 jiangcaiyang123 的回复:
我只了解SDL一点点…… 其实,我觉得只用Qt这一个框架就好了,不要杂糅其它的框架。现在只用Qt的效果还不错。
我要直接播放YUV视频,Qt不行的只能用其他第三方库才行
hjl0508 2014-12-31
  • 打赏
  • 举报
回复
引用 11 楼 openXMPP 的回复:
至于你说的换个电脑就行 还真没遇到 我以前做过一个项目 是用Qt封装成一个控件 给ASP.net调用 当时里面貌似也调用了FramelessWindowHint这个flag 后来一集成的时候 我的控件就遮住了后面的asp的控件 整个看起来像是一个“三明治"
你这个最后怎么解决的,我找了几个flags都有别的问题。
hjl0508 2014-12-31
  • 打赏
  • 举报
回复
引用 12 楼 ganjianh8 的回复:
还有,用SDL2吧,不要用SDL1.x版本了,SDL2的接口更好用,不用设外部环境变量
我感觉确实是调用winId的问题,有时候就是能看到那个失效的区域有个东西一闪就没了,这种情况就没问题,如果那里不闪的话一般就有问题,你感觉怎么处理那个winId能避免这个问题。 ps:现在用2.0还得重新熟悉2.0的用法,现在时间有点紧,能先在1.2这里解决了最好。
ganjianh8 2014-12-31
  • 打赏
  • 举报
回复
还有,用SDL2吧,不要用SDL1.x版本了,SDL2的接口更好用,不用设外部环境变量
乔巴好萌 2014-12-31
  • 打赏
  • 举报
回复
至于你说的换个电脑就行 还真没遇到 我以前做过一个项目 是用Qt封装成一个控件 给ASP.net调用 当时里面貌似也调用了FramelessWindowHint这个flag 后来一集成的时候 我的控件就遮住了后面的asp的控件 整个看起来像是一个“三明治"
乔巴好萌 2014-12-31
  • 打赏
  • 举报
回复
1) 你下换下别的flag看下效果 FramelessWindowHint 我记得FramelessWindowHint这个flag貌似会将widget绘制在底层 时间有点久了 不太确定了 你换一个flag试试 这里你也试试换成别的widgetID 比如是 parentWidget 2) sprintf(winID,"SDL_WINDOWID=0x%lx",(long unsigned int)widget->winId());
hjl0508 2014-12-31
  • 打赏
  • 举报
回复
引用 6 楼 openXMPP 的回复:
感觉是SDL遮住了Qt绘制的控件 你试试把SDL放到其他的widget上 如果你在Mainwindow里添加widget后 这个widget其实是在Mainwindow图层的上面 所以会遮住
要将widget显示出来不是应该加到mainwindow中吗,怎么把widget加到mainwindow之外的地方?
hjl0508 2014-12-31
  • 打赏
  • 举报
回复
引用 7 楼 ganjianh8 的回复:
调用winId()时间地方不对 你试一下单独调用winId,至于sdl的什么都不弄,看看会不会有这样的效果
确实跟这个有关系,开始的时候在我的电脑上调试也有问题,我以为是跟creatSDL有关所以调过CreateSDLWindow()的调用位置,现在是在我的电脑上没问题,有的电脑上有问题,那这个winId()在什么地方调用能避免这种问题呢?
ganjianh8 2014-12-31
  • 打赏
  • 举报
回复
调用winId()时间地方不对 你试一下单独调用winId,至于sdl的什么都不弄,看看会不会有这样的效果
乔巴好萌 2014-12-31
  • 打赏
  • 举报
回复
感觉是SDL遮住了Qt绘制的控件 你试试把SDL放到其他的widget上 如果你在Mainwindow里添加widget后 这个widget其实是在Mainwindow图层的上面 所以会遮住
彩阳 2014-12-30
  • 打赏
  • 举报
回复
我只了解SDL一点点…… 其实,我觉得只用Qt这一个框架就好了,不要杂糅其它的框架。现在只用Qt的效果还不错。

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧