最近在给自己的播放器(https://github.com/wang-bin/QtAV)加写非QPainter的渲染方式,解决了一些以前没碰到过的问题。
在QWidget中使用其他方式绘图,比如direct2d,gdi等(我刚学的)
1. 重载paintEvent,里面加入自己的绘图代码。这个大家都想得到
2. 重载QWidget::paintEngine() 返回0
不然画面会闪烁。可以看文档,也可以看看这个原始出处(从谈话内容看应该是的,之前无法实现的):http://lists.trolltech.com/qt4-preview-feedback/2005-04/thread00609-0.html
windows下Qt提供了QPainter::paintEngine()->getDC(),如果使用这个而不是windows的GetDC()的话可以不重载paintEngine(),因为QPainter的时自动双缓冲的。
3. 设置QWidget的属性 setAttribute( Qt::WA_PaintOnScreen, true)
文档里说这个属性设置后可以用native engine来绘图。测试了下如果不设这个属性就会闪烁。(如果你在用gdi绘图并用上面说的QPainter::paintEngine()->getDC(),那么就不要设这个属性)
4. 窗口置顶状态改变之类的要重新进行某些相应的初始化工作。比如gdi绘图的话要重新用GetDC()获取device context,direct2d的话要重新创建renderer target,因为他们是和窗口绑定的,而文档里说(windows)置顶状态改变会重新设定parent什么的,应该和这个有关,没调查过代码。如果不做这步的话窗口置顶后界面就不会更新了,再切换回来也不会。
具体代码为
最后,可以参靠我播放器里的代码 vo.h, vo.cpp: https://github.com/wang-bin/QtAV/tree/master/templates 具体例子就不写了
在QWidget中使用其他方式绘图,比如direct2d,gdi等(我刚学的)
1. 重载paintEvent,里面加入自己的绘图代码。这个大家都想得到
2. 重载QWidget::paintEngine() 返回0
不然画面会闪烁。可以看文档,也可以看看这个原始出处(从谈话内容看应该是的,之前无法实现的):http://lists.trolltech.com/qt4-preview-feedback/2005-04/thread00609-0.html
windows下Qt提供了QPainter::paintEngine()->getDC(),如果使用这个而不是windows的GetDC()的话可以不重载paintEngine(),因为QPainter的时自动双缓冲的。
3. 设置QWidget的属性 setAttribute( Qt::WA_PaintOnScreen, true)
文档里说这个属性设置后可以用native engine来绘图。测试了下如果不设这个属性就会闪烁。(如果你在用gdi绘图并用上面说的QPainter::paintEngine()->getDC(),那么就不要设这个属性)
4. 窗口置顶状态改变之类的要重新进行某些相应的初始化工作。比如gdi绘图的话要重新用GetDC()获取device context,direct2d的话要重新创建renderer target,因为他们是和窗口绑定的,而文档里说(windows)置顶状态改变会重新设定parent什么的,应该和这个有关,没调查过代码。如果不做这步的话窗口置顶后界面就不会更新了,再切换回来也不会。
具体代码为
if (event->type() == QEvent::ActivationChange) { //auto called when show //do something }
最后,可以参靠我播放器里的代码 vo.h, vo.cpp: https://github.com/wang-bin/QtAV/tree/master/templates 具体例子就不写了
补充关于Qt::WA_PaintOnScreen的解释: