[Qt2D绘图]-06QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter; QImage image(,,QImage::Format_ARGB32_Premultiplied);
// 使用绘图设备,绘制到绘图设备上
painter.begin(&image);
// 绘制一个矩形
painter.setBrush(Qt::green);
painter.drawRect(,,,); //在四个角分别绘制一个矩形,使用不同的复合模式(composition)
painter.setBrush(QColor(,,,));
//composition没有设置则使用默认的SourceOver
painter.drawRect(,,,);
//QPainter::CompositionMode_SourceIn
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
painter.drawRect(,,,);
//QPainter::CompositionMode_DestinationOver
painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
painter.drawRect(,,,);
//QPainter::CompositionMode_Xor
painter.setCompositionMode(QPainter::CompositionMode_Xor);
painter.drawRect(,,,);
painter.end(); // 绘制到当前部件(当前绘图设备是QWidget的子类,也就是部件)
painter.begin(this);
painter.drawImage(,,image);
}
#include "widget.h"
#include "ui_widget.h" #include <QMouseEvent>
#include <QPainter> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
ui->setupUi(this);
pix_buffer_ = QPixmap(, );
pix_buffer_.fill(Qt::white);
temp_pix_buffer_ = pix_buffer_;
is_drawing_ = false;
} Widget::~Widget() { delete ui; } void Widget::mousePressEvent(QMouseEvent *event) {
if(event->button() == Qt::LeftButton){
//当鼠标左键按下时获取当前位置作为矩形的开始点
start_point_ = event->pos();
is_drawing_ = true;
}
} void Widget::mouseMoveEvent(QMouseEvent *event) {
if(event->button() & Qt::LeftButton){
//当按着鼠标左键进行移动时,获取当前位置作为结束点,绘制矩形
end_point_ = event->pos();
//将缓冲区的内容复制到临时缓冲区,这样进行动态绘制时
//每次都是在缓冲区图像的基上进行绘制,就不会产生拖影现象了
temp_pix_buffer_ = pix_buffer_;
// 更新显示
update();
}
} void Widget::mouseReleaseEvent(QMouseEvent *event) {
if(event->button()== Qt::LeftButton){
//当鼠标左键松开时,获取当前位置为结束点,完成矩形绘制
end_point_ = event->pos();
//标记已经结束绘图
is_drawing_ = false;
update();
}
} void Widget::paintEvent(QPaintEvent *) {
int x = start_point_.x();
int y = start_point_.y();
int width = end_point_.x();
int height = end_point_.y(); QPainter painter;
painter.setPen(QColor(Qt::red));
painter.begin(&temp_pix_buffer_);
painter.drawRect(x,y,width,height);
painter.end(); painter.begin(this);
painter.drawPixmap(,,temp_pix_buffer_);
//如果已经完成了绘制,那么更新缓冲区
if(!is_drawing_){
pix_buffer_ = temp_pix_buffer_;
}
}
- repaint()函数或者update()函数被调用;
- 被隐藏的部件现在被重新显示;
- other
QPainter painter(this);
// 剪切矩形中的内容
painter.setClipRect(,,,);
painter.drawText(,,"tudouTestTestTest");
[Qt2D绘图]-06QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题的更多相关文章
- VC使用双缓冲避免绘图闪烁的正确使用方法【转】
使用内存DC绘图,然后实现双缓冲,避免绘图闪烁,这个小技术简单但很有效.但是仍然有很多人说使用了双缓冲,图片却仍然有闪烁,分析了几个这样的例子,发现 其实不是双缓冲的技术问题,而是使用者没有正确理解和 ...
- VC使用双缓冲制作绘图控件
最近用VC做了一个画图的控件.控件在使用的时候遇到点问题.在控件里画了图之后切换到其他页面,等再切换回来的时候,发现控件里画的图都不见了.这是因为VC里面,当缩小.遮挡页面后客户区域就会失效,当再次显 ...
- Android开发之用双缓冲技术绘图
双缓冲技术主要用在画图,动画效果上,其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去. 双缓冲技术可以有效防止闪烁,提高显示质量. DrawView.java: package ...
- VC GDI双缓冲机制绘图防屏幕闪烁实现步骤
在OnDraw(CDC* pDC) 中添加如下代码 CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设 ...
- Qt组件中的双缓冲无闪烁绘图
双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOn ...
- C#-gdi绘图,双缓冲绘图,Paint事件的触发
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1 绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...
- [Android学习笔记]双缓冲绘图技术
双缓冲技术绘图: 什么情况下产生的双缓冲技术?当数据量很大时,绘图可能需要花费很长的时间,这样屏幕就会出现卡顿,闪烁等现象. 什么是双缓冲技术?双缓冲是在内存中创建一个与屏幕绘制区域一致的对象,先将图 ...
- java的双缓冲技术
Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色.在Java游戏编程和动画编程中最常见的就是对于屏幕闪烁的处理.本文从J2SE的一个再现了屏幕闪烁的Java Appilication简单 ...
- C# GDI+双缓冲技术
我想有很多搞图形方面的朋友都会用到双缓冲技术的时候,而且有的时候她的确是个头疼的问题.最近我也要用双缓冲技术,程序怎么调试都不合适,当要对图形进行移动时,总是会出现闪烁抖动.在网上找了些资料,说得都不 ...
随机推荐
- 基于Web的监控系统的开发进行分布式和现代生产(外文翻译)
摘要 近年来,Web技术发展迅速.尤其是网络浏览器增强了其功能因为JavaScript,CSS3和HTML5的改进.因此,功能越来越丰富的基于Web的软件解决方案功能范围可用.通过使用响应式网页设计( ...
- Eplan PLC连接点-两两相连接方法
Eplan PLC连接点-两两相连接方法. 1.插入->符号连接->T节点(向右). 2.如图 3.如图 然后再.插入->符号连接->T节点(向左). 重复2,3.即可完成两两 ...
- WeChair项目Alpha冲刺(9/10)
团队项目进行情况 1.昨日进展 Alpha冲刺第九天 昨日进展: 前端:安排页面美化,设计实名认证 后端:更新dao层代码 数据库:修改数据表属性,与后端部署数据库交互 2.今日安排 前端:继续 ...
- Java架构师如何学习?
引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭",同时互联网技术又日新月异,很多工程师都疲 ...
- vue通过属性绑定为元素绑定style行内样式
1.直接在元素上通过:style绑定书写 <h1 :style="{color: 'red','font-size': '40px'}">这是一 ...
- 恕我直言你可能真的不会java第5篇:Stream的状态与并行操作
一.回顾Stream管道流操作 通过前面章节的学习,我们应该明白了Stream管道流的基本操作.我们来回顾一下: 源操作:可以将数组.集合类.行文本文件转换成管道流Stream进行数据处理 中间操作: ...
- MySQL服务器是怎么处理客户端请求的
不论MySQL客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果).那服务器进 ...
- java基础 内部类详解
什么是内部类? 1.内部类也是一个类: 2.内部类位于其他类声明内部. 内部类的常见类型 1.成员内部类 2.局部内部类 3.匿名内部类 4.静态内部类 简单示例 /** * 外部类 * */ pub ...
- disruptor架构四 多生产者多消费者执行
1.首先介绍下那个时候使用RingBuffer,那个时候使用disruptor ringBuffer比较适合场景比较简单的业务,disruptor比较适合场景较为复杂的业务,很多复杂的结果必须使用di ...
- Python3-configparser模块-配置文件解析器
Python3中的configparser模块主要用于处理类似于windows ini 文件结构的配置文件 1.configparser模块提供实现基本配置语言的ConfigParser类 2.配置文 ...