QWidget 之paint部分杂记(从Qt4.0到4.8的进化,在Qt 4.4中,Alien Widget诞生了)


Qt 4.0


automatically double-buffers


Qt 4.1


QWidget::autoFillBackground


Qt 4.2


delayed widget creation (DWC)


stylesheet


Qt 4.3


QWidget::render


Qt 4.4


Alien Widget


Qt 4.5


Translucent Windows


Qt 4.6


widget‘s graphics effect


Qt 4.8


lighthouse (qpa)

Qt4.0

  • 在Qt 4.0中,启用双缓冲,不必在paintEvent()中编写双缓冲代码来避免闪烁。

Qt4.1

  • 在Qt 4.1中,通过启用背景自动传递(propagation),widget不再有任何默认的背景。引入backingstore这个东西。

Qt4.2

  • 在Qt 4.2中,延时控件创建(delayed widget creation)的引入,使得widget可以在没有真实窗口句柄的情况下被创建。

QWindowSurface 与 QWidgetBackingStore

Even though QWidget is a QPaintDevice subclass, one will never render directly into a QWidget’s surface. Instead, during the paintEvent, the painting is redirected to an offscreen surface which is represented by the internal class QWindowSurface.

QWidgetBackingStore is responsible for figuring out which parts of the window surface needs to be updated prior to showing it to screen, so its really a repaint manager.

When the concept of backingstore was introduced in Qt 4.1, the two classes were the same, but the introduction of more varying ways to get content to screen made us split it in two.

Qt4.4

  • 在Qt 4.4中,Alien Widget诞生了,这样一来,Window和Widget尽管仍是同一个类,却是不同的东西。Window负责与窗口系统的联系。Alien被号称是所有闪烁的终结者,见Qt Invaded By Aliens — The End of All Flicker

Qt::WA_NativeWindow


创建原生窗体,即带句柄


Qt::WA_PaintOnScreen


强制创建原生窗体


Qt::Window


顶级窗口,必须是原生窗体 (?)


QGLWidget


必须是原生窗体

如果一个widget已经是alien Widget,如果对其设置上述标志,或者对其调用winId()函数,都会导致其重新创建为一个native widget。

Qt4.5

  • 在Qt 4.5中,graphics system的概念被引入(比如选项有:raster|opengl|x11|native 等)。引人了一个Qt::WA_TranslucentBackground 属性,这个东西和QWidget::setWindowOpacity()有些比较容易混哈。

QWidget::setWindowOpacity()函数,设置窗体(即:isWindow()为真的widget)的整体不透明度, 从0.0到1.0之间, 值越大越不透明。

Qt::WA_TranslucentBackground,这个属性每个QWidget都可以单独设置。不被绘制的区域(背景)都是透明的,绘制的区域的透明程度通过颜色或图片的Alpha Channel值来控制。

Qt4.6

  • 在Qt 4.6中,graphics effect被引入。但是,现在,已经不建议使用:
Graphics Effects
State: Deprecated
Reasoning: flawed design, we don’t recommend taking maintainership of this code.

QGraphicsEffect 的子类需要重新实现draw()函数。

以安装了QGraphicsOpacityEffect了QWidget为例,当每次需要重绘时,QWidgetPrivate::drawWidget()不是发送QPaintEvent事件,以调用我们的paintEvent()函数;而是调用QGraphicsOpacityEffect的draw()函数,该函数内,通过QWidget::render()调用paintEvent()将内容绘制在一个QPixmap中,而后设置QPainter的不透明度,绘制QPixmap到目标。

Qt4.8

  • 在Qt 4.8中,正式引入lighthouse了,...

参考

http://blog.csdn.net/dbzhang800/article/details/6835722

时间: 2024-11-05 16:26:50

QWidget 之paint部分杂记(从Qt4.0到4.8的进化,在Qt 4.4中,Alien Widget诞生了)的相关文章

第0课 - 搭建开发环境之安装QT

第0课 - 搭建开发环境之安装Qt 1. 课程学习的原材料 - Visual Studio 2010 - Qt SDK 4.7.4 - Qt Creator 2.4.1 2. Visual Studio 2010 (1)用于学习 Windows 上 GUI 程序设计的原理 (2)体会使用 C/C++ 编写 GUI 窗口应用程序 (3)展现 Qt 对于 Windows 窗口开发的面向对象封装 3. Qt SDK 与 Qt Creator - Qt SDK 为 Qt 开发提供必要的类和函数,以及相关

Qt中各个widget前后位置的设定(在Qt中,所有问题都要一分为二,QWidget体系和QGraphicsWidget体系)

这两天在总结一些以往project中遇到的问题,正好别组有同事问我关于Qt中各个widget窗口的前后位置是如何定义的,这里就总结一下: 在Qt中,所有问题都要一分为二,讨论两种不同的情况:一个是最常用的QWidget体系,而另外一个则是QGraphicsWidget体系. ①:在常用的QWidget体系中,设置前后位置是主要是用raise(),underStack(),hide()函数. 理论为:在Qt中每个widget窗口都维持着自己的一个创建栈(widget's stack.),栈里边存放

cyg_io_read返回值是0,因为读到的字节长度在参数中

len = cyg_io_read(ser_handle1, ucMasterRTURcvBuftmp, &len);// len等于0,cyg_io_read读到的字节数在参数中的红色的len,而不是前面的len cyg_io_read函数的说明中有: Syntax:Cyg_ErrNocyg_io_read( cyg_io_handle_t handle, void *buf, cyg_uint32 *len );Parameters:        handle—handle to the

C++ Gui Qt4编程学习之路(1)——Qt环境搭建

前言 因为公司需要做一个关于linux下qt的开发,加上直接接触过一些qt,便开始临阵磨枪了. 之前有用qt写过一个2048的游戏,大概3.4月份的时候,那会2048正火,想想自己在电脑上也做了一个~便默默的写了一个,界面有些丑陋,却五脏俱全~下次把思路和一些代码再归纳归纳,再写到博客里来. 虽然写过一点小东西,但基础还是很单薄,所以为了让基础更加巩固一些,便开始阅读C++ Gui Qt4编程这本书,这本书的确挺不错的. Qt环境搭建 首先要搭建Qt的环境,网上有很多版本供下载的,我便下载最新的

树和森林v2.0 层次非递归创建树和森林,森林中的树不连

#include <iostream> #include"queue.h"//之前写的类 #include"stack.h" //之前写的类 using namespace std; /* 用二叉树的方式实现 root指针指向第一棵树的根节点 */ template <class T> class Forest; //======================================== // 森林节点类声明 template &l

在windows2008 x64 上安装10.2.0.4后的bug--Oracle software忘记设置注册表中的NLS_LANG值

该问题被标记为: Bug 8277395: WINDOWS 2008 X64 10.2.0.4 INSTALLATION DOESN'T SET NLS_LANG REGISTRY , windows x64 bit在安装时没有设置NLS_LANG 请注意: windows2008 x64 所认证通过的Oracle DB版本为10.2.0.4 和10.2.0.5,而windows2008 x64 下Oracle DB 10.2.0.4 是有一个完整安装介质的,不是patch本身. 在Bug 82

CMP R0,#0 指令,看看对应的十六进制值和so中的值是否对应

但是到这里,我们已经可以确认一件事就是so中的解密函数逻辑有一层防护就是判断当前调用so的应用包名是否为正确的视频包名,如果不是就不走正确的解密逻辑了.所以这里我们需要修改一下so指令,让这个判断无效.修改指令其实很简单,我们看到他通过判断strstr函数返回的NULL值,也就是对应 CMP R0,#0 指令值,然后后面有一个BEQ跳转指令,这里我们可以这么改,他不是和0判断吗?其实0就是NULL值,我们把他改成和1比较,这样strstr函数返回了NULL值也就是0,和1比较不相等.那就正确的逻

从0开始学Java——JSP和Servlet——如何在Eclipse中配置Web容器为tomcat

windows- >Preferences -> Server->runtime Envirement ->Add 点击下一步,然后按照如下设置:

NGUI 3.9.0 Tween实现Toggle点击下拉菜单(游戏中常见的边角主菜单入口)

单机游戏中这个熟悉的按钮,会弹出如下一样的菜单,相信初次看到的,肯定会很惊奇,That's Great!接下来让我告诉大家其中的做法. 1.创建Toggle ,前景图(Background)为,CheckMark 为.(两个为Sprite,从图集中选取,关于如何添加Sprite与制作图集,在这里不做主要叙述了) 2.制作下拉菜单,(1)创建一个Panel作为父容器.(2)在Panel下面添加Sprite,命名为MenuListPanelBkSprite,此为下拉菜单的背景图片.(3)在MenuL