在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内容即可。

qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程相关推荐

  1. ARM中C语言和汇编语言的混合编程

    1.内联汇编 在C语言中内嵌汇编注意事项: 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突R12和R13可能被编译器用来存放中 ...

  2. 物联网中C语言与汇编语言,ARM Cortex-M架构CPU中C语言和汇编语言的混合编程

    这里主要从3个方面讲一下C和汇编的混合编程,包括相互之间的函数调用 1 汇编代码中调用C函数 在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名,然后将C的代码放在一个C文件中进行编译 我 ...

  3. 在OC项目中添加Swift文件并实现混合编程

    对于已经工作的开发者,并不适合也没有条件从一个全新的swift项目开始,进行开发. 虽然网上关于swift和oc混合编程的教程比较多,但是大多是基于 swift项目的,所以对咱们 OCer的参考价值有 ...

  4. ARM中C和汇编混合编程及示例

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  5. QT5百度地图开发学习——qt调用JavaScript函数并传参

    文章目录 前言 一.通信桥梁bridge 二.QT与JS相互通信(调用函数) 1.QT调用js函数 前言 在上文<QT5百度地图开发学习--控件提升展示地图>中,我们通过控件提升的方式在同 ...

  6. qt调用mysql调用了存储过_Qt调用Server SQL中的存储过程

    Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...

  7. 【转】Qt调用dll中的功能函数

    DLL 优点 ------------------------------------- 1.扩展了应用程序的特性: 2.可以用许多种编程语言来编写: 3.简化了软件项目的管理: 4.有助于节省内存: ...

  8. 【Qt】ubuntu14.04.5 qt5.6中使用opencv3.4报错:Using GTK+ 2.x and GTK+ 3 in the same process is not supported

    问题描述 ubuntu14.04.5 qt5.6中使用opencv3.4报错: Using GTK+ 2.x and GTK+ 3 in the same process is not support ...

  9. QT调用C#写的Dll

    QT调用C#写的Dll 参见: https://blog.csdn.net/weixin_42420155/article/details/81060945 C#写的dll是没有dllMain入口函数 ...

最新文章

  1. python标准库介绍——23 UserString 模块详解
  2. 《C++面向对象高效编程(第2版)》——导读
  3. IOS使用通知回调方法
  4. iOS---iPad开发及iPad特有的特技
  5. php token 验证,PHP如何实现Token验证
  6. 告诉刚入行的兄弟们,钱是这么赚的!
  7. 23种设计模式(九)对象创建之原型模式
  8. Phoenix使用注意事项以及跟标准sql的不同
  9. Word图文混排之杂志封面排版教程
  10. 自己动手做一个爬虫项目
  11. 自定义 QTreeView
  12. java通讯录管理系统_java实现通讯录管理系统
  13. 桌面cpu与服务器cpu天梯,秒懂台式电脑CPU性能 桌面CPU天梯图2017年9月最新版
  14. JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
  15. android 7 uc flash,UC浏览器7.2版新增加FLASH游戏支持功能
  16. 安全渗透测试工具--Burpsuite的爬虫功能
  17. 计算机操作系统原理——第一章.绪论
  18. 关于前辈RPC学习的经验分享:我的DedSec RPC
  19. 在市场买一个小鸡都要20多块,为什么加工好的童子鸡才19块?
  20. Windows环境下,输入(Chkntfs /X C:)命令可以取消系统每次启动对C盘的磁盘扫描程序

热门文章

  1. Nginx 基础 ( 二)
  2. 用Python执行js文件代码并获取返回结果
  3. Android 节操视频播放器jiecaovideoplayer自定义播放音频使用:屏蔽全屏按钮,增加倒计时,当前时间/总时间
  4. linux之dos2unix命令解决vi打开文件行尾巴显示^M
  5. Android之INSTALL_FAILED_INSUFFICIENT_STORAG解决办法
  6. sq工程师是做什么的_算法工程师为什么成天做数据,都做哪些数据?
  7. 有生之年必看!原来历史还可以这样震撼,看完我惊呆了...
  8. 三年磨一剑,五次被拒稿,交大博士坚持稿件申诉,终发表学科顶刊
  9. 怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。
  10. 备赛脱脂经验分享_IEO国际经济学奥林匹克初选宏观备赛经验分享