Qt::WA_OpaquePaintEvent理解
Qt助手中对Qt::WA_OpaquePaintEvent解释如下:
Indicates that the widget paints all its pixels when it receives a paint event. Thus, it is not required for operations like updating, resizing, scrolling and focus changes to erase the widget before generating paint events. The use of WA_OpaquePaintEvent provides a small optimization by helping to reduce flicker on systems that do not support double buffering and avoiding computational cycles necessary to erase the background prior to painting. Note: Unlike WA_NoSystemBackground, WA_OpaquePaintEvent makes an effort to avoid transparent window backgrounds. This flag is set or cleared by the widget's author.
其含义大体是说:
指示窗体在收到绘制事件时,绘制它的所有像素。因此,在收到绘制事件之前,对于更新、大小调整、滚动条滚动、焦点更变等操作时,并不要求窗体擦除窗体背景。使用该标志对那些不支持双缓冲区的系统提供了小小的优化,从而减小闪烁;同时避免在绘制之前因擦除背景需要计算而耗费时间。不同于WA_NoSystemBackground标志,WA_OpaquePaintEvent 尽量避免窗体背景透明,这个标志是由窗体的开发者设置或清除。
以上是Qt官方的解释。个人理解如下:
1): 指示窗体在收到绘制事件时,绘制它的所有像素。这里“收到绘制事件”个人理解应该是第一
次收到绘制事件时,也即窗体构建时,就把窗体所有的像素绘制一遍。
2):窗体一旦在完成1)中说的绘制完一遍所有像素后,此后所有有关窗体的更新、大小改变,焦
点改变、滚动条滚动等操作都不会擦除窗体背景。也就是说以前画的东西都不会擦除重绘。
也就是以前画的不重新计算、不重新绘制。当以前绘制的东西很费时间时(如:某个曲线、
某个图形是经过某个复杂的数学运算得出的),不重绘、不重新计算,这将节约很多cpu时间
大大提高效率(这也就是设置本标志后,不闪烁的原因吧)。
一个设置Qt::WA_OpaquePaintEvent标志的例子如下:
#include "QtWidgetsApplication1.h"
#include<QPainter>QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent): QWidget(parent)
{ui.setupUi(this);setWindowTitle("parent");
}QtWidgetsApplication1::~QtWidgetsApplication1()
{}void QtWidgetsApplication1::paintEvent(QPaintEvent* event)
{QPainter painter(this);for (int i = 0; i < 1000; ++i){int r = qrand() % 255;int g = qrand() % 255;int b = qrand() % 255;QPen pen(qRgb(r, g, b));pen.setWidth(2);painter.setPen(pen);int x = qrand() % 800;int y = qrand() % 800;// 其实核心内容就是调用这一个函数而已painter.drawPoint(x, y);}}
main函数如下:
#include "QtWidgetsApplication1.h"
#include <QtWidgets/QApplication>
#include<QTime>
#include<QThread>int main(int argc, char *argv[])
{QApplication a(argc, argv);QtWidgetsApplication1 w;w.show();w.setAttribute(Qt::WA_OpaquePaintEvent);QTime timer;{timer.start();// 调用此函数即相当于Windows中的GetMessage,系列函数,包括了tranlate,分发函数等的所有操作// 此处是控制帧数的关键点while (1){a.processEvents();w.repaint();QThread::sleep(1);}}return a.exec();
}
运行后弹出窗体如下:
可以看到,窗体背景是黑色即不透明,因为不擦除背景即不擦除以前绘制的,故当第1次绘制事件发生时,绘制1000个点;第2次绘制事件发生时,再绘制1000个点,那么第N次后,绘制的总点数为1000*N个。当屏蔽掉上面main.cpp的如下代码:
w.setAttribute(Qt::WA_OpaquePaintEvent);
则窗体背景为正常颜色且每次绘制之前都会擦除以前绘制的,故N次后窗体依然只有1000个点,如下:
Qt::WA_OpaquePaintEvent理解相关推荐
- qt信号量理解及使用
信号量可以理解为互斥量的延伸或者说是互斥量的泛化,一个互斥量只能锁一次,但信号量则可以获取多次,信号量经常在多线程或多进程中用来保护一定数量的共享资源,线程必须要获取一个信号量,举个例子: 有一个餐馆 ...
- Qt httpserver 理解与使用
目录 概述 核心概念-路由 多线程处理 Qt Https Server 概述 Qt提供了创建简单web服务器的拓展模块,即qthttpserver 关于该模块的一些信息: Introducing th ...
- Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总
Qt::WindowType标志通过如下函数设置: setWindowFlag 或 setWindowFlags 注意:这两个函数的区别是:不加s的每次只能设置一个Qt::WindowType标志位, ...
- Qt开发经验小技巧合集
一.开发经验 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时 ...
- Qt武林秘籍学习笔记摘要
1 原文链接 Qt开发经验: 自己总结的这十多年来做Qt开发以来的经验,以及Qt相关武林秘籍电子书,会一直持续更新增加,欢迎各位留言增加内容或者提出建议,谢谢! (gitee.com) 编程语录: 自 ...
- Qt开发经验(转载)
0 前言说明 本文转载于https://qtchina.blog.csdn.net/?type=blog,feiyangqingyun的博客,感谢大佬的经验分析. 1 开发经验 01:001-010 ...
- qt android 滑动效果,【转】Qt仿Android带特效的数字时钟源码分析(滑动,翻页,旋转效果)...
这个数字时钟的源码可以在Qt Demo中找到,风格是仿Android的,不过该Demo中含有三种动画效果(鉴于本人未曾用过Android的系统,因此不知道Android的数字时钟是否也含有这三种效果) ...
- Qt仿Android带特效的数字时钟源码分析(滑动,翻页,旋转效果)
这个数字时钟的源码可以在Qt Demo中找到,风格是仿Android的,不过该Demo中含有三种动画效果(鉴于本人未曾用过Android的系统,因此不知道Android的数字时钟是否也含有这三种效果) ...
- qtabwidget放大_Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)...
写Qt程序时遇到一个问题: Qt自带的弹窗功能单一,所以须要自己用ui设计弹窗的内容,这样弹窗就和普通窗口一样了,但问题是这个弹窗显示后父窗口还是活动的.网上找了很久找到了解决办法: Qt::Wind ...
最新文章
- 大数相乘--极简单的思路
- DeepKey:科学家提出一种基于脑纹独特性的多模态生物识别系统可以防范身份欺骗...
- 开源 java CMS - FreeCMS2.8 栏目页静态化参数
- kdir测试软件,[OK210开发板体验]入门篇(4)编程入门(NFS登录、驱动入门)
- Xcode 8带来的新特性和坑
- linuxcentos防ssh爆破
- 用 Doc2Vec 得到文档/段落/句子的向量表达
- 磁盘管理之基本操作格式化
- 机房收费系统可行性研究报告
- 基于javaweb+jsp的会议室管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap Ajax)
- 特种部队2全面反击bt电影种子下载
- nifty bootstrap_nifty admin_nifty admin 下载-一个高端的bootstrap后台管理模板
- 使用Kotlin配合RxJava网络请求
- 阿里巴巴图标库(iconfont)使用
- mysql-8.0.28-winx64安装步骤
- 企业与个人是如何跨越战略转折点 - 读《只有偏执狂才能生存》
- 数据通信网络的基本概念
- linux解压tar后缀的包,解压tar包的linux命令的详细说明
- Outlook默认接收地址修改
- 日语中动物的叫声是怎样的-狗子怎么叫的
热门文章
- 《管理转型》——读书随笔
- oracle触发器中保存临时数据,Oracle使用游标触发器存储实操
- python 修改json文件的value值,利用python修改json文件的val
- 自控matlab设计,自动控制原理课程设计--基于MATLAB软件的自动控制系统仿真
- c语言电子计算器课程设计报告,计算机程序设计课程设计报告.doc
- php 库存自动减少,ECSHOP付款后自动减少库存功能
- 电子科技大学20春《c语言》在线作业1,[电子科技大学]20秋《C语言》在线作业123(答案)...
- Docker两个问题的讨论
- MySql DATE_FORMAT函数用法
- 运行Vue在ASP.NET Core应用程序并部署在IIS上