qt 调用qpainter_在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内容即可。
qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程相关推荐
- ARM中C语言和汇编语言的混合编程
1.内联汇编 在C语言中内嵌汇编注意事项: 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突R12和R13可能被编译器用来存放中 ...
- 物联网中C语言与汇编语言,ARM Cortex-M架构CPU中C语言和汇编语言的混合编程
这里主要从3个方面讲一下C和汇编的混合编程,包括相互之间的函数调用 1 汇编代码中调用C函数 在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名,然后将C的代码放在一个C文件中进行编译 我 ...
- 在OC项目中添加Swift文件并实现混合编程
对于已经工作的开发者,并不适合也没有条件从一个全新的swift项目开始,进行开发. 虽然网上关于swift和oc混合编程的教程比较多,但是大多是基于 swift项目的,所以对咱们 OCer的参考价值有 ...
- ARM中C和汇编混合编程及示例
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...
- QT5百度地图开发学习——qt调用JavaScript函数并传参
文章目录 前言 一.通信桥梁bridge 二.QT与JS相互通信(调用函数) 1.QT调用js函数 前言 在上文<QT5百度地图开发学习--控件提升展示地图>中,我们通过控件提升的方式在同 ...
- qt调用mysql调用了存储过_Qt调用Server SQL中的存储过程
Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...
- 【转】Qt调用dll中的功能函数
DLL 优点 ------------------------------------- 1.扩展了应用程序的特性: 2.可以用许多种编程语言来编写: 3.简化了软件项目的管理: 4.有助于节省内存: ...
- 【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 ...
- QT调用C#写的Dll
QT调用C#写的Dll 参见: https://blog.csdn.net/weixin_42420155/article/details/81060945 C#写的dll是没有dllMain入口函数 ...
最新文章
- python标准库介绍——23 UserString 模块详解
- 《C++面向对象高效编程(第2版)》——导读
- IOS使用通知回调方法
- iOS---iPad开发及iPad特有的特技
- php token 验证,PHP如何实现Token验证
- 告诉刚入行的兄弟们,钱是这么赚的!
- 23种设计模式(九)对象创建之原型模式
- Phoenix使用注意事项以及跟标准sql的不同
- Word图文混排之杂志封面排版教程
- 自己动手做一个爬虫项目
- 自定义 QTreeView
- java通讯录管理系统_java实现通讯录管理系统
- 桌面cpu与服务器cpu天梯,秒懂台式电脑CPU性能 桌面CPU天梯图2017年9月最新版
- JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
- android 7 uc flash,UC浏览器7.2版新增加FLASH游戏支持功能
- 安全渗透测试工具--Burpsuite的爬虫功能
- 计算机操作系统原理——第一章.绪论
- 关于前辈RPC学习的经验分享:我的DedSec RPC
- 在市场买一个小鸡都要20多块,为什么加工好的童子鸡才19块?
- Windows环境下,输入(Chkntfs /X C:)命令可以取消系统每次启动对C盘的磁盘扫描程序
热门文章
- Nginx 基础 ( 二)
- 用Python执行js文件代码并获取返回结果
- Android 节操视频播放器jiecaovideoplayer自定义播放音频使用:屏蔽全屏按钮,增加倒计时,当前时间/总时间
- linux之dos2unix命令解决vi打开文件行尾巴显示^M
- Android之INSTALL_FAILED_INSUFFICIENT_STORAG解决办法
- sq工程师是做什么的_算法工程师为什么成天做数据,都做哪些数据?
- 有生之年必看!原来历史还可以这样震撼,看完我惊呆了...
- 三年磨一剑,五次被拒稿,交大博士坚持稿件申诉,终发表学科顶刊
- 怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。
- 备赛脱脂经验分享_IEO国际经济学奥林匹克初选宏观备赛经验分享