Qt开发技术:Qt绘图系统(⼀)绘图系统介绍
《》
svg图形《》
前话
红胖⼦,来也!
Qt的图形绘制系统,(分为2D图形和3D图形,本篇章主要介绍2D图形绘制系统)。
Qt绘图系统
Qt5中的图形主要是通过命令式QPainter API或Qt的声明性UI语⾔Qt Quick及其场景图后端来完成的。Qt5的图形功能还包括对打印以及加载和保存各种图像格式的⽀持
QPainter绘制2D图形
QPainter提供了将⽮量图形、⽂本和图像绘制到不同⾯(可理解为画布)或QPaintDevice实例(如QImage、QOpenGlPaintDevice、QWidget和QPrinter)上的API。实际的绘图发⽣在QPaintDevice的Q
PaintEngine中。软件光栅器和
OpenGL(ES)2.0后端是两个最重要的QPaintEngine实现。光栅绘制引擎是Qt的软件光栅化器,在绘制QImage或QWidget时使⽤。它在OpenGL绘制引擎上的优势在于启⽤抗锯齿时的⾼质量,以及完整的功能集。
绘制系统:概述QPainer类和架构。
坐标系统:说明QPainer坐标系的⼯作原理。
绘制和填充:说明QPainter如何执⾏⽮量形状的填充和⼤纲绘制。
QPainer最重要的渲染⽬标是:
QImage:⼀种与硬件⽆关的直接像素访问图像表⽰。QPainer将使⽤软件光栅器绘制QImage实例。
QPixmap:⼀种适合在屏幕上显⽰的图像表⽰。QPainer将主要使⽤软件光栅器绘制到QPixmap实例。
QOpenGLPaintDevice:⼀个要呈现到当前OpenGL 2.0上下⽂的绘制设备。QPainter将使⽤硬件加速的OpenGL调⽤来绘制QopenglPaintDevice实例。
QBackingStore:顶级窗⼝的backbuffer。QPainer将主要使⽤软件光栅器绘制到QBackingStore实例。
QWidget:⽤于预qt快速⽤户界⾯类的基类。qpainter将使⽤qbackingstore呈现⼩部件。
QOpenGLWidget:画家也可以在QOpenGLWidget上打开。这是为了⽅便起见,因为从技术上讲,这与使⽤QopenGLPaintDevice 没有什么不同。
QPainer和相关类是Qt GUI模块的⼀部分。
OpenGL and 3D
OpenGL是硬件加速和3D图形最⼴泛采⽤的图形API,在所有桌⾯平台以及⼏乎所有移动和嵌⼊式平台上实现。Qt库包含许多类,可⽅便的将OpenGL集成到其应⽤程序中。
Qt GUI中的OpenGL—OpenGL如何与qt-gui模块集成的概述。
QopenglWidget是⼀个⼩部件,允许将OpenGL场景添加到基于QWidget的⽤户界⾯中。
OpenGL和Qt Quick 2.0-如何将OpenGL集成到Qt Quick 2.0场景图中。
/opengl-官⽅OpenGL页⾯。
qt canvas 3d-⼀个附加模块,提供了⼀种使⽤javascript从qt quick调⽤OpenGL类3d绘图的⽅法。
在Qt5.0之前,Qt中的OpenGL⽀持由Qt OpenGL模块处理。这个模块仍然存在,但是新的代码应该旨在使⽤Qt GUI模块中的新类。类很容易根据其名称进⾏区分:不应使⽤带有QGL前缀的类。相反,更喜欢从QOpenGl开始的。
绘图系统
Qt的绘图系统可以使⽤相同的API在屏幕和打印设备上进⾏绘制,并且主要基于QPainter、QPaintDevice和QPaintEngine类。(对于⼀般绘图开发者主要关注QPainter)
QPainter⽤于执⾏绘图操作,QPaintDevice是可以使⽤QPainter绘制的⼆维空间的抽象,QPainter提供了⽤于绘制不同类型设备的界⾯。QPaintEngine类由QPainter和QPaintDevice在内部使⽤,除⾮应⽤程序程序员创建⾃⼰的设备类型,否则对他们隐藏。
这种⽅法的主要好处是,所有的绘制都遵循相同的绘制管道,因此很容易添加对新特性的⽀持,并为不⽀持的特性提供默认实现。
绘图类
这些类为在绘制设备上绘制提供⽀持。
序号类名描述
1QLine            使⽤整数精度的⼆维⽮量(直线)
2QLineF使⽤浮点精度的⼆维⽮量(直线)
3QMargins使⽤整数精度定义矩形的四个边距
4QMarginsF使⽤浮点精度定义矩形的四个边距
5QPoint使⽤整数精度定义平⾯中的点
6QPointF使⽤浮点精度定义平⾯中的点
7QRect使⽤整数精度定义平⾯中的矩形
8QRectF使⽤浮点精度定义平⾯中的矩形
9QSize使⽤整数精度定义⼆维对象的⼤⼩
10QSizeF使⽤浮点精度定义⼆维对象的⼤⼩
11QBitmap单⾊(1位深度)像素地图
12QIcon不同模式和状态下的可缩放图标
13QIconEngine QIcon呈现器的抽象基类
14QImage 与硬件⽆关的图像表⽰,允许直接访问像素数据,并可⽤作绘制设备。
15QImageReader格式独⽴的接⼝,⽤于从⽂件或其
他设备读取图像
16QImageWriter 格式独⽴的接⼝,⽤于将图像写⼊⽂件或其他设备
17QPixmap可以⽤作绘制设备的屏幕外图像表
18QGenericMatrix 表⽰具有n列和m⾏的NXM转换矩阵的模板类
19QVector2D表⽰⼆维空间中的向量或顶点
20QBrush 定义由QPainer绘制的形状的填充图案
21QConicalGradient与QBrush结合使⽤以指定圆锥形
渐变画笔
22QGradient 与QBrush结合使⽤以指定渐变填充
23QLinearGradient与QBrush结合使⽤以指定线性渐
变画笔
24QRadialGradient 与QBrush结合使⽤以指定线性渐变画笔
25QColor基于RGB、HSV或CMYK值的颜⾊26QPagedPaintDevice表⽰⽀持多页的绘画设备
27QPaintDevice可以⽤QPainer绘制的对象的基类
28QPaintEngine 关于QPainer如何在给定平台上绘制给定设备的抽象定义
29QPainter对⼩部件和其他绘制设备执⾏低级
绘制
30QPainterPath ⽤于绘制操作的容器,允许构造和重⽤图形形状
31QPainterPathStroker⽤于⽣成给定绘制路径的可填充轮
32QPdfWriter类以⽣成可⽤作绘制设备的pdf
33QPen定义QPainer应如何绘制形状的线
条和轮廓
34QPolygon使⽤整数精度点向量
35QPolygonF使⽤浮点精度点向量
36QRegion为绘制者指定剪辑区域
37QRgba64结构包含64位RGB颜⾊
38QTransform指定坐标系的⼆维转换
39QFont指定⽤于绘制⽂本的字体
40QFontMetrics使⽤整数精度字体度量信息
41QFontMetricsF使⽤浮点精度字体度量信息
42QPlatformFontDatabase 使⾃定义如何发现字体以及如何呈现字体成为可能
43QSupportedWritingSystems
在内部Qt fontdatabase中注册字
体时使⽤
44QStylePainter⽤于在窗⼝中绘制QStyle元素的类45QColormap将与设备⽆关的QColors映射到与
设备相关的像素值
46QSvgGenerator⽤于创建SVG图形的绘制设备
47QSvgRenderer⽤于将SVG⽂件的内容绘制到绘制
设备上
48QSvgWidget ⽤于显⽰可缩放⽮量图形(SVG)⽂件内容的窗⼝
绘制设备和后端处理
创建绘图设备
QPaintDevice类是可以绘制的对象的基类,即QPainter可以绘制任何QPaintDevice⼦类。QPaintDevice的绘图功能由QWidget、QImage、QPixmap、QPicture、QPrinter和QOpenGLPaintDevice实现。
QWid g e t
QWidget类是Qt Widgets模块中⽤户界⾯元素的基类。它从窗⼝系统接收⿏标、键盘和其他事件,并
在屏幕上绘制⾃⾝的表⽰。
QI m ag e
QImage类提供了⼀种独⽴于硬件的图像表⽰,它针对I/O和直接像素访问和操作进⾏了设计和优化。QImage⽀持多种图像格式,包括单⾊、8位、32位和阿尔法混合图像。
使⽤QImage作为绘制设备的⼀个优点是可以以平台独⽴的⽅式保证任何绘制操作的像素精确性。另⼀个好处是,可以在当前GUI线程之外的其他线程中执⾏绘制。
QPix m ap
QPixmap类是⼀种⾮屏幕图像表⽰,它是为在屏幕上显⽰图像⽽设计和优化的。与QImage不同,pixmap中的像素数据是内部的,由底层窗⼝系统管理,即只能通过QPainter函数或通过将QPixmap转换为QImage来访问像素。
为了使⽤QPixmap优化绘图,Qt提供了QPixmapCache类,该类可⽤于存储⽣成成本⾼昂的临时pixmap,⽽不使⽤⽐缓存限制更多的存储空间。
Qt还提供QBitmap便利类,继承QPixmap。QBitmap保证单⾊(1位深度)像素映射,主要⽤于创建⾃定义QCursor和QBrush对象,构建QRegion对象。
Op e nG L Paint D e v ice
如前所述,Qt提供的类使在Qt应⽤程序中使⽤OpenGL变得容易。例如,QOpenGLPaintDevice启⽤OpenGL API以使⽤QPainter 进⾏渲染。
QPictur e
QPicture类是⼀个绘制设备,⽤于记录和重放QPainter命令。图⽚以独⽴于平台的格式将painter命令序列化到IO设备。QPicture也与分辨率⽆关,即QPicture可以显⽰在看起来相同的不同设备上(例如svg、pdf、ps、打印机和屏幕)。
Qt提供QPicture::load()和QPicture::save()函数以及⽤于加载和保存图⽚的流式运算符。
定义后端处理
可以通过从QPaintDevice类派⽣并重新实现重载QPaintDevice::paintEngine()函数来实现对新后端的⽀持,以告诉QPainter应该使⽤哪个绘制引擎来绘制此特定设备。要实际能够在设备上绘制,此绘制引擎必须是通过从QPaintEngine类派⽣⽽创建的⾃定义绘制引擎。
绘制和填充
绘制
Painter提供⾼度优化的功能来完成⼤多数图形⽤户界⾯程序所需的⼯作。它可以绘制从简单的图形原语(由QPoint、QLine、QRect、QRegion和QPolygon类表⽰)到⽮量路径等复杂形状的所有内容。在qt中,⽮量路径由QPainterPath类表⽰。QPainterPath提供了⼀个⽤于绘制操作的容器,使图形能够被构造和重⽤。
使⽤QPen类绘制线条和轮廓。笔由其样式(即线条类型)、宽度、画笔、端点的绘制⽅式(笔帽样式)以及两条连接线之间的连接⽅式(连接样式)定义。笔的画笔是⽤于填充笔⽣成的笔画的QBrush对象,即QBrush类定义填充图案。
QPainer还可以绘制对齐的⽂本和像素图。
绘制⽂本时,使⽤QFont类指定字体。Qt将使⽤具有指定属性的字体,或者如果不存在匹配的字体,Qt将使⽤最接近的匹配安装字体。实际使⽤的字体属性可以使⽤QFortInfo类来检索。此外,QFontMetrics类提供字体度量,⽽QFontDatabase类提供有关底层窗⼝系统中可⽤字体的信息。
通常,QPainer绘制⼀个“⾃然”坐标系,但它能够使⽤QTransform类执⾏视图和世界转换。有关详细信息,请参见坐标系,该坐标系还描述渲染过程,即逻辑表⽰与渲染像素之间的关系,以及抗锯齿绘制的好处。
抗锯齿绘图
绘制时,像素渲染由QPaint::Antialising指令控制。QPainter::RenderHint枚举⽤于指定任何给定引擎可能遵守或不遵守的QPainter 标志。
QPaint::Antialising值指⽰引擎应尽可能消除基本体的边,即使⽤不同的颜⾊强度平滑边(抗锯齿)。
填充
使⽤QBrush类填充形状。画笔由其颜⾊和样式(即填充图案)定义。
Qt中的任何颜⾊都由⽀持RGB、HSV和CMYK颜⾊模型的QColor类表⽰。QColor还⽀持alpha混合的
⼤纲和填充(指定透明度效果),类是平台和设备独⽴的(颜⾊使⽤QColormap类映射到硬件)。有关更多信息,请参见QColor类⽂档。
可⽤的填充模式由Qt::BrushStyle枚举描述。这些包括基本图案,从均匀的颜⾊到⾮常稀疏的图案,各种线条组合,渐变填充和纹理。Qt⽀持⾃定义填充背景,提供QGradient类来定义⾃定义渐变填充,⽽纹理模式是使⽤QPixmap类指定的。
坐标系统
坐标系由QPainer类控制。与QPaintDevice和QPaintEngine类⼀起,QPainter构成了qt绘画系统的基础,Arthur。QPainter⽤于执⾏绘图操作,QPaintDevice是可以使⽤QPainter绘制的⼆维空间的抽象,QPaintEngine提供了⽤于绘制不同类型设备的界⾯。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。