一、重绘事件

前面讲到的所有绘制操作都是在重绘事件处理函数paintEvent()中完成的,是QWidget类中定义的函数。一个重绘事件用来重绘一个部件的全部或者部分区域,下面几个原因中的任意一个都会发生重绘事件:

  • repaint()函数或者update()函数被调用;
  • 被隐藏的部件现在被重新显示;
  • 其他一些原因。

大部分部件可以简单地重绘它们的全部界面,但是一些绘制比较慢的部件需要进行优化而只绘制需要的区域(可以使用QPaintEvent::region()来获取该区域)。Qt也会通过合并多个重绘事件为一个事件来加快绘制,当update()函数被调用多次,或者窗口系统发送了多个重绘事件,那么Qt就会合并这些事件成为一个事件,而这个事件拥有最大的需要重绘的区域。

update()函数不会立即进行重绘,要等到Qt返回主事件循环后才会进行,所以多次调用update()函数一般只会引起一次paintEvent()函数调用。而调用repaint()函数会立即调用paintEvent()函数来重绘部件,只有在必须立即进行重绘操作的怡况下(比如在动画中),才使用repaint()函数。update()允许Qt优化速度和减少闪烁,但是repaint()函数不支持这样的优化,所以建议一般情况下尽可能使用update()函数。还要说明一下,在程序开始运行时就会自动发送重绘事件而调用paintEvent()函数。另外,不要在paintEvent()函数中调用update()或者repaint()函数。

当重绘事件发生时,要更新的区域一般会被擦除,然后在部件的背景上进行绘制。部件的背景一般可以使用setBackgroundRole()来指定,然后使用setAutoFillBackground(true)来启用指定的颜色。例如使界面显示比较深的颜色,可以在部件的构造函数中添加如下代码:

this->setBackgroundRole(QPalette::Dark);
this->setAutoFillBackground(true);

二、剪切

QPainter可以剪切任何的绘制操作,可以剪切一个矩形、一个区域或者一个路径中的内容,这分别可以使用setClipRect()、setClipRegion()和setClipPath()函数来实现。剪切会在QPainter的逻辑坐标系统中进行。下面的代码实现了剪切一个矩形中的文字:

QPainter painter;
painter.setClipRect(10, 0, 20, 10);
painter.drawText(10, 10, tr("yafeilinux"));

三、播放 gif 动画

QMovie类是使用QlmageReader来播放动画的类,使用它可以播放不带声音的简单的动画,它支持gif和mng文件格式。这个类提供了很方便的函数来进行动画的开始、暂停和停止等操作。可以参考该类的帮助文档,也可以查看一下Movie Player示例程序,它在Widgets分类中。

四、渲染SVG文件

可缩放矢量图形(Scalable Vector GraphiCS,SVG)是一个使用XML来描述二维图形和图形应用程序的语言。在Qt中可以使用QSvgWidget类来很容易地加载一个SVG文件,而使用QSvgRenderer类在QSvgWidget中进行SVG文件的渲染。这两个类的使用很简单,这里就不再讲述。可以参考一下SVG

Generator和SVG Viewer示例程序,它们都在Painting分类中

Qt 2D绘图之四:绘图中的其他问题的更多相关文章

  1. Qt 2D绘图之二:抗锯齿渲染和坐标系统

    一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...

  2. qt 2D绘图技巧

    2D绘图 Qt4中的2D绘图部分称为Arthur绘图系统.它由3个类支撑整个框架,QPainter,QPainterDevice和QPainterEngine.QPainter用来执行具体的绘图相关操 ...

  3. 3.emWin5.26(ucGui)VS2008 2-D图形库-基本绘图【Worldsing笔记】

    UCGUI(emWin) 2-D图形库--之基本板绘图,在ucgui的基本绘图功能上来看,功能还是比较全的,本例程主要使用基本的接口,两个主要的概念是绘制(draw)和填充(Fill),这两的区别是一 ...

  4. iOS - Quartz 2D 二维绘图

    1.Quartz 2D 简介 Quartz 2D 属于 Core Graphics(所以大多数相关方法的都是以 CG 开头),是 iOS/Mac OSX 提供的在内核之上的强大的 2D 绘图引擎,并且 ...

  5. 界面编程之QT绘图和绘图设备20180728

    /*******************************************************************************************/ 一.绘图 整 ...

  6. matlab学习笔记8 基本绘图命令-初级二维绘图/交互式绘图

    一起来学matlab-matlab学习笔记8 基本绘图命令_5 初级二维绘图/交互式绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...

  7. Qt在VS(Visual Studio)中使用

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt在VS(Visual Studio)中使用     本文地址:https://www.te ...

  8. 三维数据曲面图 season绘图 panda绘图

    三维数据曲面图 season绘图 panda绘图 待办 enter description here 转化成网格坐标 season可以让绘图更美观 panda绘图可以直接根据panda数据绘制图直接p ...

  9. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的按钮改变缺省文字的方法

    在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...

  10. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox增加自定义按钮的方法

    在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...

随机推荐

  1. DTLS学习笔记 -- RFC 4347- 6347

    想学习一下dtls,是因为想以后没有公司免费VPN可用的时候,我能买一个主机,自己建一个VPN. 1.介绍 Web, email大多用TLS协议来做安全的网络传输,它们必须跑在可靠的TCP传输通道里. ...

  2. Linux-正则表达式学习(精)

    正则表达式30分钟入门教程 来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混 ...

  3. WSDL文档深入分析

    借助jdk的wsimort.exe工具生成客户端代码 格式:wsimport -keep url   //url为wsdl文件的路径 直接生成客户端代码会抛异常, 无法生成客户端代码, 解决办法: 将 ...

  4. escape() VS encodeURI() VS encodeURIComponent()

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...

  5. Nginx的Location正则表达式

    location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作. location的语法 已=开头表示精确匹 ...

  6. python:将字典转化为数据框

    my_dict = {,,} import pandas as pd pd.Series(my_dict) fuck i you dtype: int64 一个key只有一个value的字典如果直接转 ...

  7. Swift扩展

    Swift中的「扩展」(extensions)和OC中的categories类似,只是Swift中的「扩展」没有名字.Swift中的「扩展」可以向一个已有的类/结构体/枚举类型添加新功能,这包括在没有 ...

  8. Ubuntu12.04下安装、使用、卸载MySQL

    转自:http://blog.csdn.net/yimi0903/article/details/11800713 一.安装 Step1:安装MySQL-server,mysql-client 执行以 ...

  9. CentOS6.6 zookeeper完全集群搭建

    centos6.6搭建zookeeper-3.4.6完全分布式环境 转载 2015-06-28 22:14:17 标签:it 为了搭建HBase完全分布式环境,前提就是搭建好zookeeper和Had ...

  10. mfc为对话框添加启动画面

    新建CwzdSplash类 CwzdSplash.h #pragma once class CWzdSplash : public CWnd { DECLARE_DYNAMIC(CWzdSplash) ...