Qt组件中的双缓冲无闪烁绘图
双缓冲绘图
在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图。使用双缓冲,可以减轻绘制的闪烁感。在有些情况下,用户要关闭双缓冲,自己管理绘图。下面的语句设置了窗口部件的Qt::WA_PaintOnScreen属性 ,就关闭了窗口部件的双缓冲.
mywidget->setAttribute(Qt::WA_PaintOnScreen);
由于Qt4不再提供异或笔,组合模式QPainter::CompostionMode_Xor()并不是异或笔,Qt4只提供了QRubberBand实现矩形和直线的绘图反馈。因此要实现在绘图中动态
反馈必须使用其他方法。程序中使用双环冲来解决这个问题。在绘图过程中,一个缓冲区绘制临时内存,一个缓冲区保存绘制好的内容,最后进行合并。
在交互绘图过程中,程序将图像缓冲区复制到临时缓冲区,并在临时缓冲区上绘制,绘制完毕在将结果复制到图像缓冲区,如果没有交互复制,则直接将图像缓冲区绘制显示到屏幕上。
Qt组件中的双缓冲无闪烁绘图
闪烁首先,要想把闪烁减弱,请设置组件的背景模式为NoBackground.
setBackgroundMode(NoBackground);
其次,重载组件的paintEvent()函数,如下改写:
void MyWidget::paintEvent(QPaintEvent *e)
{
QRect ur=e->rect();//得到组件尺寸
QPixmap pix(ur.size());//以此为参数创建一个位图变量
pix.fill(this,ur.topLeft());//填充位图
QPainter p(&pic);//以位图为参数创建一个QPainter 对象
p.translate(-ur.x(),-ur.y());//在QPainter 上绘画
//......//Drawing
p.End();//绘画完毕
bitBlt(this,ur.topLeft().&pix);//把位图贴到组件上
//注从qt4开始,bitBlt函数不在使用,取而代之的是drawPixmap。
}
// 这是能随机绘点的关键,没有设置此属性,默认相当于每次Qt都会完整的将上一次的屏幕擦除,
// 新版的Qt中已经没有了repaint(bool)接口了。
w.setAttribute(Qt::WA_OpaquePaintEvent);
老电视机雪花效果中每次都需要擦除重绘避免点的叠加所以一下语句注释掉
// w.setAttribute(Qt::WA_OpaquePaintEvent);
(
void Plotter::updateRubberBandRegion()
{
QRect rect = rubberBandRect.normalized();
转换坐标后,我们设置画笔的颜色(使用函数前面预定义的颜色),调用drawPolyline()绘制曲线,经过所有的曲线上的点。
http://blog.csdn.net/Last_Impression/archive/2008/05/20/2463647.aspx
转载于:https://www.cnblogs.com/lvdongjie/p/5393411.html
Qt组件中的双缓冲无闪烁绘图相关推荐
- C++零食:WTL中使用双缓冲避免闪烁
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板.首先我们在内存环境中建立一个"虚拟"的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制 ...
- VC绘图中的双缓冲技术
VC绘图中的双缓冲技术 转自:VC 绘图,使用双缓冲技术实现 ********************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)******************* **** ...
- VC中的双缓冲绘图技术
之前在做图形绘制的时候,发现在拖动图形时候,会出现闪烁的情况,后来就上网找了一下双缓冲绘图,本文非原创,只是想保存下来,以后要用的时候不用再到处去搜,也希望能帮助有这方面困惑的朋友 原文来自http: ...
- java 坦克重叠_【Java】我所知道坦克大战(单机版)之画出坦克的实心圆、让圆动起来、双缓冲解决闪烁问题...
28640发布于 今天 02:47 本篇文章目的 画出坦克的实心圆 让坦克圆动起来 双缓冲解决闪烁问题 一.画出代表坦克的实心圆 我们需要画出一个圆,那么可以使用fillOval方法 fillOval ...
- Winform中的双缓冲
(1)在应用程序中使用双缓冲的最简便的方法是使用 .NET Framework 为窗体和控件提供的默认双缓冲.通过将 DoubleBuffered 属性设置为 true. this.DoubleBuf ...
- Qt之旅---10 双缓冲绘图
1 基本知识 但我们使用painter进行快速绘图时会看到类似图下 的情况 双缓冲绘图技术 的原理 用两个画布进行绘图,一个用于显示,一个用于绘制,也就是将图画之后再显示 就可以避免上面的情况. 2 ...
- C语言编程闪屏,双缓冲解决VC++绘图时屏幕闪烁
通常来说程序根据需要调用Invalidate(FALSE)使窗口客户区无效引起重绘,然后在窗口OnPaint函数(基于文档视图的程序则是OnDraw)中进行稳定绘图就行了.但是,我们在OnPaint中 ...
- Android中实现双缓冲(画板应用)和XML文件定义菜单
1.什么是双缓冲技术?双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果. 为什么要使用双缓冲技术?拿Android 游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没 ...
- 控制台双缓冲防闪烁--功能封装
使用时,将包括#define DATALEN 10000的语句以及整个类.全局变量scrbuf的定义都拷贝到你的代码文件中. 默认不开启双缓冲. 调用scrbuf.on()开始双缓冲模式 此模式下,输 ...
最新文章
- Python组织文件 实践:查找大文件、 用Mb、kb显示文件尺寸 、计算程序运行时间...
- webform登录操作中正则表达式运用
- jl1.如何设置元素的宽高包含元素的边框和内边距
- linux 启动,停止mysql
- 鲲鹏支持java_#化鲲为鹏,我有话说# 鲲鹏弹性云服务器配置 JAVA 环境
- C++11线程库模板
- GitHub Actions 持续集成
- Zookeeper的Leader选举
- Java编程:中缀表达式转后缀表达式
- 玩大了,开源协议修改引发MongoDB“大动荡”?
- 【风速预测】基于matlab EMD+模拟退火算法优化DBN风速预测【含Matlab源码 JQ003期】
- Android 基础控件与线性布局
- 程序员的自我修养(雾)
- Win7怎么设置工作组?Win7电脑设置工作组的方法
- 华为“鸿蒙”所涉及的微内核到底是什么?一文带你认识微内核
- 【沧海拾昧】微机原理:8086/8088中断系统
- mysql numeric 区别_Mysql中NUMERIC和DECIMAL类型区别比较
- python_模块_包
- java有substr方法_java substring和substr
- Flutter中PlatformView组件无法刷新的问题
热门文章
- TensorFlow中Variable()和get_variable()
- python判断列表为空的三种方法
- 【人工智能中“预测”的知识点】
- 拉氏变换法求解线性常微分方程(系统的零状态响应)
- Matlab--Figure界面工具栏使用简要说明
- 使你的C/C++代码支持Unicode
- Delphi格式化函数Format FormatDateTime和FormatFloat
- 滑动窗口的最小值问题
- 贪心法——区间覆盖问题
- 3D 机器视觉 01 - 格雷码在3D视觉中的运用和码位选择原则