打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程

在Qt5.4的Example中,有一个例子qopenglwidget,介绍了QOpenGLWidget和QPainter,但是在使用过程中,需要注意哪些方面呢?我在最初使用的时候就遇到两者不能同时使用的问题,经过一番折腾,终于解决了该问题。下面,我将需要注意的点记录下来,以便查询。

第一种方法,也就是直接QOpenGLWidget的paintGL函数中绘制两者,其步骤为:

void GLWidget::paintGL() {

QPainter painter;
    painter.begin(this);
painter.beginNativePainting();

//绘制3D内容

......

//注意:1、一定要释放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等;2、如果开启深度测试,一定要关闭。例如:

m_program->release();
    m_vao.release();
    m_logoVbo.release();
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);

painter.endNativePainting();

//绘制2D内容

......

painter.end();

}

第二种方法,是在网上找的,其贴子地址http://blog.csdn.net/sdaujiaojiao/article/details/41898207,该贴主应该无法使用第一种方法,所以,另辟蹊径。现将方法也列出来,便于杳找,如若想详细了解,请到上面的网址。其步骤为:首先,重载两个函数paintGL、paintEvent;然后,就是实现,但是这种方法需要释放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等,也不需要关闭深度测试。

void GLWidget::paintGL()
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

......

}

void GLWidget::paintEvent(QPaintEvent *e) 

{

makeCurrent();
    paintGL();
    QPainter pter(this);
    pter.setPen(Qt::blue);
    pter.drawText(20,50,"This is a Text!");
    pter.end();
    update();

}

在第二种方法中,paintGL和paintEvent的调用是一一对应的;起初,我还以为paintGL每次更新,会被调用两次,经过测试,其只被paintEvent函数调用一次。

两种方法都有其优点,在根据需要选择;第二种方法,比较适合扩展,无需改动原因的代码,只需要重载paintEvent,并在函数中调用paintGL,并绘制2D内容即可。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
QT中的GL
Qt 显示图片 放大 缩小 移动
QT中使用QPainter在ui子控件中绘图
【pyqt5学习】
30.QT
Qt WebKit学习笔记(5)---实战QWebView—3
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服