QT原理与源码分析之如何开发一个自定义的绘图设备和QT绘图引擎?
简介
本文将介绍如何自定义QT绘图设备类和如何自定义QT绘图引擎类。
目录
QT绘图设备抽象类QPaintDevice
QT绘图引擎抽象类QPaintEngine
自定义绘图设备类
自定义绘图引擎类
运行效果
正文
QT绘图设备抽象类QPaintDevice
绘图设备是二维空间的抽象,可以使用QPainter绘制。其默认坐标系的原点位于左上角位置。X 向右增加,Y 向下增加。单位为一个像素。
QPaintDevice的绘图功能目前由QWidget,QImage,QPixmap,QPicture和QPrinter子类实现。
从QT助手 API DOC中可以找到QPaintDevice类型的API接口。

QPaintDevice类型的API接口
QT绘图引擎抽象类QPaintEngine
Qt为我们支持不同绘图后端提供了几个QPaintEngine的预制实现。提供的主要绘图引擎是光栅绘制引擎,其中包含一个软件光栅器,该光栅器支持所有受支持平台上的全部功能集。这是在Windows,X11和macOS等基于QWidget的类上绘画的默认设置,它是在QImage上绘画的后端,它被用作不支持某种功能的绘画引擎的后备。此外,我们还为OpenGL(可通过QOpenGLWidget访问)和打印(允许使用QPainter在QPrinter对象上绘制)提供QPaintEngine实现。
自定义绘图设备类
从QT助手 API DOC中写了这样一段话来介绍如何自定义绘图设备,最关键的一点就是自定义一个绘图设备类时,必须同时自定义一个与之对应的绘图引擎类。
To implement support for a new backend, you must derive from QPaintDevice and reimplement the virtual paintEngine() function to tell QPainter which paint engine should be used to draw on this particular device. Note that you also must create a corresponding paint engine to be able to draw on the device, i.e derive from QPaintEngine and reimplement its virtual functions.
要实现对新后端的支持,您必须从 QPaintDevice 派生并重新实现虚函数 paintEngine() ,以告诉 QPainter 应该使用哪个绘图引擎来绘制此特定设备。请注意,您还必须创建一个相应的绘图引擎才能在设备上绘图,即从 QPaintEngine 派生并重新实现其虚函数。
下面是自定义的QT绘图设备类的定义。

自定义QT绘图设备类ButianyunPaintDevice
自定义绘图引擎类
如果要使用 QPainter 绘制到不同的后端,则必须对 QPaintEngine 进行子类化并重新实现其所有虚函数。然后,通过子类化 QPaintDevice 并重新实现虚函数 QPaintDevice::paintEngine( )来提供 QPaintEngine 实现。
下面是自定义的QT绘图引擎。

自定义QT绘图引擎ButianyunPaintEngine
运行效果
下面是使用这个自定义的绘图设备和绘图引擎的一个测试代码。

使用这个自定义的QT绘图设备和绘图引擎的一个测试代码

使用这个自定义的QT绘图设备和绘图引擎的一个测试代码
下面是运行效果,左边是自定义绘图设备和绘图引擎的绘图结果,右边是QT框架内部的绘图设备和绘图引擎的绘图结果。

自定义QT绘图设备和QT绘图引擎的运行效果
总结
本文介绍了如何自定义QT绘图设备类和如何自定义QT绘图引擎类。
如果您认为这篇文章对您有所帮助,请您一定立即点赞+喜欢+收藏,本文作者将能从您的点赞+喜欢+收藏中获取到创作新的好文章的动力。如果您认为作者写的文章还有一些参考价值,您也可以关注这篇文章的作者。
QT原理与源码分析之如何开发一个自定义的绘图设备和QT绘图引擎?的更多相关文章
- 深入理解python虚拟机:调试器实现原理与源码分析
深入理解python虚拟机:调试器实现原理与源码分析 调试器是一个编程语言非常重要的部分,调试器是一种用于诊断和修复代码错误(或称为 bug)的工具,它允许开发者在程序执行时逐步查看和分析代码的状态和 ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- ConcurrentHashMap实现原理及源码分析
ConcurrentHashMap实现原理 ConcurrentHashMap源码分析 总结 ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对Ha ...
- HashMap和ConcurrentHashMap实现原理及源码分析
HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表, ...
- (转)ReentrantLock实现原理及源码分析
背景:ReetrantLock底层是基于AQS实现的(CAS+CHL),有公平和非公平两种区别. 这种底层机制,很有必要通过跟踪源码来进行分析. 参考 ReentrantLock实现原理及源码分析 源 ...
- 【转】HashMap实现原理及源码分析
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景极其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...
- 【OpenCV】SIFT原理与源码分析:DoG尺度空间构造
原文地址:http://blog.csdn.net/xiaowei_cqu/article/details/8067881 尺度空间理论 自然界中的物体随着观测尺度不同有不同的表现形态.例如我们形 ...
- 《深入探索Netty原理及源码分析》文集小结
<深入探索Netty原理及源码分析>文集小结 https://www.jianshu.com/p/239a196152de
- HashMap实现原理及源码分析之JDK8
继续上回HashMap的学习 HashMap实现原理及源码分析之JDK7 转载 Java8源码-HashMap 基于JDK8的HashMap源码解析 [jdk1.8]HashMap源码分析 一.H ...
- 【OpenCV】SIFT原理与源码分析:关键点描述
<SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一篇<方向赋值>,为找到的关键点即SI ...
随机推荐
- CF709B 题解
洛谷链接&CF 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\) 个点,在一条数轴上,位置为 \(x_1,-,x_n\),你的位置为 \(p\) ...
- 领域驱动设计(DDD)分层架构的三种模式
模式一:四层架构 1.User Interface为用户界面层(或表示层),负责向用户显示信息和解释用户命令.这里指的用户可以是另一个计算机系统,不一定是使用用户界面的人.2.Application为 ...
- 概括下为什么要用vue开发
很多老程序员,习惯了使用原生html和js来开发前端页面,对于很多没用过vue的程序员来说,觉得没有必要. 下面,我来概括下vue的一些好处: 1.控件自动跟数据绑定,提交表单到后台的时候,可以直接使 ...
- Fiddler使用界面介绍-底部状态栏
底部状态栏 1.Capturing抓包状态 Capturing:Fiddler正在抓包 空白:Fiddler停止抓包 2.All Processes抓取进程类型 All Processes:抓取所有进 ...
- web3的的入口,钱包,为什么说加密钱包是Web 3活动入口
Web3.0让未来充满了想象力,或许超越当今人类所知的互联网.有可能彻底改变人类社交互动.商业往来和整个互联网经济.同时数字加密货币行业从业者对Web 3.0赋予了很高期待,希望通过结合后打破互联网巨 ...
- 2、SpringBoot2之入门案例
2.1.创建Maven工程 2.1.1.创建空项目 2.1.2.设置项目名称和路径 2.1.3.设置项目sdk 2.1.4.项目初始状态 注意:需要关闭项目再重新打开,才能看到SpringBoot-P ...
- 【SpringBoot】15 数据访问P3 整合Mybatis
重新建立一个SpringBoot工程 选择依赖组件 然后删除不需要的Maven&Git文件 还是先查看我们的POM文件 整合Mybatis的组件多了这一个,默认的版本是3.5.4 然后再看看整 ...
- WPF【无限滚动图片浏览】自定义控件
自定义控件 自定义控件是我比较陌生的一个主题.我好久没练习过wpf了,需要巩固记忆.我想了一会儿,打开动漫之家,忽然觉得这个看漫画的图片浏览控件有意思.于是特地花了一天做了这个图片控件.我原本以为很容 ...
- SpringBoot优雅开发REST API最佳实践
写在前面 博主最近在做一个数据服务的项目,而这个数据服务的核心就是对外暴露的API,值得高兴的这是一个从0开始的项目,所以终于不用受制于"某些历史"因素去续写各种风格的Contro ...
- 结构体中vector的初始化报错:expected identifier before numeric constant
结构体中vector的初始化报错:expected identifier before numeric constant 结构体中vector初始化 起因: 我想在结构体中初始化含有3个元素的vect ...