在Qt Widget中使用QPainter之外的引擎进行绘图

本文探讨在Qt Widget中使用QPainter之外的绘图引擎,如利用QPainter::beginNativePainting()和endNativePainting()进行原生绘图,但遇到闪烁问题。同时,提到了自定义paintEngine()和QpaintDevice的方法,以实现更复杂的绘图需求。参考代码可在QtAV项目的templates目录下的vo.h和vo.cpp找到。
    最近在给自己的播放器(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. 重载showEvent()。窗口置顶状态改变之类的要重新进行某些相应的初始化工作。比如gdi绘图的话要重新用GetDC()获取device context,direct2d的话要重新创建renderer target,因为他们是和窗口绑定的,而文档里说(windows)置顶状态改变会重新设定parent什么的,先hide然后show,正好可以用showEvent()。应该和这个有关,没调查过代码。如果不做这步的话窗口置顶后界面就不会更新了,再切换回来也不会
Qt4中,要使用QPainter和QGraphicsView框架绘制自定义图形并处理坐标变换,首先需要了解这些类的基本概念和相互关系。QPainter是用于执行所有绘图操作的类,而QGraphicsView框架提供了一个用于展示和管理2D图形元素的场景图模型。 参考资源链接:[QT4绘图详解:QPainter与GraphicsView框架](https://wenku.youkuaiyun.com/doc/763twgn359?spm=1055.2569.3001.10343) 使用QPainter时,可以通过继承QWidget并重写paintEvent()方法来使用它。在paintEvent()中,首先创建一个QPainter对象,然后使用QPainter绘制函数来绘制图形。例如,绘制一个简单的圆形可以使用以下代码: ```cpp void CustomWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(QPen(Qt::blue, 2)); // 设置线条颜色和宽度 painter.setBrush(QBrush(Qt::red)); // 设置填充颜色 painter.drawEllipse(100, 100, 200, 200); // 绘制一个圆形 } ``` 在处理坐标变换时,QPainter提供了translate(), scale(), rotate()等方法来改变坐标系统。例如,如果你想在绘制圆形之前将坐标原点移动到窗口的中心,可以使用: ```cpp QPainter painter(this); painter.translate(width() / 2, height() / 2); // 将原点移动到中心 // 绘制图形的代码... ``` 对于QGraphicsView框架,你需要创建一个QGraphicsScene对象来作为图形元素的容器,并将QGraphicsView关联到这个场景。然后,你可以通过QGraphicsItem及其子类来添加自定义的图形元素到场景中。QGraphicsView框架支持交互,如拖动、缩放和平移,并且可以处理视图坐标和场景坐标的转换。 在QGraphicsView中,如果你需要对视图进行坐标变换,可以使用QGraphicsView的setTransform()方法。例如,你可以对视图进行缩放: ```cpp QGraphicsView view(&scene); view.setTransform(QTransform().scale(2.0, 2.0)); // 将视图缩放两倍 ``` 通过这些基本的操作,你可以开始在Qt4应用程序中使用QPainter和QGraphicsView框架来创建和展示自定义图形。此外,为了深入理解和掌握这些概念,建议参考《QT4绘图详解:QPainter与GraphicsView框架》,这本教程深入解析了这些类的使用方法,并提供了丰富的示例和技巧,帮助你更好地应用这些工具在实际项目中。 参考资源链接:[QT4绘图详解:QPainter与GraphicsView框架](https://wenku.youkuaiyun.com/doc/763twgn359?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值