• Qt绘图系统


    一.Qt绘图系统简介

    Qt的绘画系统支持使用相同的API在屏幕和打印设备上进行绘画,并且主要基于QPainter、QPaintDevice和QPaintEngine类。这种方法的主要优点是,所有绘制都遵循相同的绘制管道,从而可以轻松添加对新功能的支持,并为不支持的功能提供默认实现。

    • QPainter用于执行绘制操作
    • QPaintDevice是可以使用QPainter绘制的二维空间的抽象,
    • QPaintEngine提供了画家用于在不同类型的设备上绘制的界面。QPaintEngine类由QPainter和QPaintDevice内部使用,除非应用程序程序员创建自己的设备类型,否则对他们来说是隐藏的。

    在这里插入图片描述

    二.支持绘图系统的类

    说明
    QBitmap单色(1位深度)像素图
    QBrush定义QPainter绘制的形状的填充图案
    QColor基于RGB、HSV或CMYK值的颜色
    QColorSpace颜色空间抽象
    QColorTransform颜色空间之间的转换
    QColormap将与设备无关的QColors映射到与设备相关的像素值
    QConicalGradient与QBrush结合使用,指定锥形渐变笔刷
    QFont指定用于图形文本的字体查询
    QFontMetrics字体度量信息
    QFontMetricsF字体度量信息
    QGenericMatrix表示具有N列和M行的NxM转换矩阵的模板类
    QGradient与QBrush结合使用以指定渐变填充
    QIcon不同模式和状态下的可扩展图标
    QIconEngineQIcon渲染器的抽象基类
    QImage硬件独立的图像表示,允许直接访问像素数据,并可用作绘制设备
    QImageReader用于从文件或其他设备读取图像的独立于格式的界面
    QImageWriter用于将图像写入文件或其他设备的格式独立接口
    QLine使用整数精度的二维矢量
    QLineF使用浮点精度的二维矢量
    QLinearGradient与QBrush结合使用以指定线性渐变笔刷
    QMargins定义矩形的四个边距
    QMarginsF定义矩形的四个边距
    QPagedPaintDevice表示支持多页的绘制设备
    QPaintDevice可以使用QPainter绘制的对象的基类
    QPaintEngineQPainter如何在给定平台上绘制给定设备的抽象定义
    QPainter在小部件和其他绘制设备上执行低级绘制
    QPainterPath用于绘制操作的容器,允许构建和重用图形形状
    QPainterPathStroker用于生成给定画家路径的可填充轮廓
    QPdfWriter类生成可用作绘制设备的PDF
    QPen定义QPainter应如何绘制形状的线条和轮廓
    QPixmap可用作绘画设备的屏幕外图像表示
    QPoint使用整数精度定义平面中的点
    QPointF使用浮点精度定义平面中的点
    QPolygon使用整数精度的点矢量
    QPolygonF使用浮点精度的点矢量
    QRadialGradient与QBrush结合使用以指定径向渐变笔刷
    QRect使用整数精度定义平面中的矩形
    QRectF使用浮点精度定义平面中的矩形
    QRegion指定画家的剪辑区域
    QRgba64结构包含64位RGB颜色
    QSize使用整数点精度定义二维对象的大小
    QSizeF使用浮点精度定义二维对象的大小
    QStylePainter用于在小部件中绘制QStyle元素的便利类
    QSupportedWritingSystems在内部Qt字体数据库中注册字体时使用
    QSvgGenerator用于创建SVG图形的绘制设备
    QSvgRenderer用于将SVG文件的内容绘制到绘图设备上
    QSvgWidget用于显示可缩放矢量图形(SVG)文件内容的小部件
    QTransform指定坐标系的二维变换
    QVector2D表示二维空间中的向量或顶点

    三.绘图后端

    QPaintDevice 类是可以绘制的对象的基类,即 QPainter 可以在任何QPaint设备子类上绘制。QPaintDevice的绘图功能由 QWidget, QImage, QPixmap, QPicture, QPrinter, 以及QOpenGLPaintDevice.实现。

    Widget QWidget 类是 Qt Widgets 模块中用户界面元素的基类。它从窗口系统接收鼠标、键盘和其他事件,并在屏幕上绘制自己的表示。
    Image QImage类提供了一种独立于硬件的图像表示,它针对I/O以及直接像素访问和操作进行了设计和优化。 QImage支持多种图像格式,包括单色、8位、32位和阿尔法混合图像。 使用 QImage作为绘制设备的一个优点是可以以独立于平台的方式保证任何绘制操作的像素精度。另一个好处是可以在当前GUI线程之外的另一个线程中执行绘制。
    Pixmap QPixmap 类是一种屏幕外图像表示,它是为在屏幕上显示图像而设计和优化的。与QImage不同,像素图中的像素数据是内部的,由底层窗口系统管理,即像素只能通过QPainter函数或通过将QPixmap转换为QImage来访问。 为了优化使用QPixmap的绘图,Qt提供了 QPixmapCache 类,该类可用于存储临时像素映射,生成这些临时像素映射时不需要使用超过缓存限制的更多存储空间。 Qt还提供了QBitmap便利类,继承了 QPixmapQBitmap 保证单色(1位深度)像素图,主要用于创建自定义QCursorBrush 对象,构建QRegion对象。
    OpenGL Paint Device 如前所述,Qt提供的类使在Qt应用程序中使用OpenGL变得容易。例如, QOpenGLPaintDevice启用OpenGL API以使用QPainter进行渲染。
    Picture QPicture类是一个记录和回放QPainter命令的绘制设备。图片以独立于平台的格式将画家命令序列化到IO设备。QPicture也是独立于分辨率的,即QPicture可以显示在看起来相同的不同设备上(例如svg、pdf、ps、打印机和屏幕)。 Qt提供了 QPicture::load() 和 QPicture::save()函数以及用于加载和保存图片的流运算符。
    Custom Backends 通过从QPaintDevice 类派生并重新实现虚拟 QPaintDevice::paintEngine()函数,可以实现对新后端的支持,以告诉 QPainter 应该使用哪个绘制引擎在该特定设备上绘制。要真正能够在设备上绘制,此绘制引擎必须是通过从QPaintEngine类派生而创建的自定义绘制引擎。

    四.绘图和填充

    绘图

    QPainter 提供了高度优化的功能来完成大多数GUI程序所需的绘图。它可以绘制从简单图形图元(由 QPoint, QLine, QRect, QRegionQPolygon 类表示)到复杂形状(如矢量路径)的所有内容。在Qt中,矢量路径由QPainterPath 类表示。QPainterPath 提供了一个用于绘制操作的容器,允许构建和重用图形形状。

    QPainterPath是由直线和曲线组成的对象。例如,矩形由直线组成,椭圆由曲线组成。与普通绘图操作相比,绘制路径的主要优点是复杂的形状只需要创建一次;然后可以只调用QPainter::drawPath()函数多次绘制它们。QPainterPath 对象可用于填充、勾勒和剪裁。若要为给定的绘制者路径生成可填充轮廓,请使用QPainterPathStroker 类。

    使用 QPen类绘制线条和轮廓。钢笔由其样式(即线型)、宽度、画笔、端点的绘制方式(封口样式)以及两条连接线之间的连接方式(连接样式)定义。笔的画笔是一个QBrush对象,用于填充用笔生成的笔划,即 QBrush 类定义了填充模式。QPainter 还可以绘制对齐的文本和位图。绘制文本时,使用 QFont 类指定字体。Qt将使用具有指定属性的字体,或者如果不存在匹配的字体,Qt将采用最匹配的已安装字体。可以使用QFontInfo 类检索实际使用的字体的属性。此外,QFontMetrics 类提供字体度量,QFontDatabase类提供有关底层窗口系统中可用字体的信息。通常,QPainterCoordinate System中绘制,但它能够使用QTransform 类执行视图和世界变换。有关详细信息,请参见坐标系,它还描述了渲染过程,即逻辑表示和渲染像素之间的关系,以及抗锯齿绘制的好处。

    填充

    形状使用QBrush类填充。画笔由其颜色和样式(即填充图案)定义。
    Qt中的任何颜色都由支持RGB、HSV和CMYK颜色模型的QColor类表示。QColor还支持alpha混合的轮廓和填充(指定透明度效果),该类与平台和设备无关(使用 QColormap类将颜色映射到硬件)。有关详细信息,请参阅QColor类文档。可用的填充模式由 Qt::BrushStyle 枚举描述。这些包括从均匀颜色到非常稀疏图案的基本图案、各种线条组合、渐变填充和纹理。Qt提供了 QGradient 类来定义自定义渐变填充,而纹理模式是使用 QPixmap 类指定的。

    Qt::BrushStyle

    内容说明
    Qt::NoBrush0无笔刷图案
    Qt::SolidPattern1统一的颜色
    Qt::Dense1Pattern2极其密集的刷纹
    Qt::Dense2Pattern3非常密集的刷纹
    Qt::Dense3Pattern4有点密集的笔刷图案
    Qt::Dense4Pattern5半密刷纹
    Qt::Dense5Pattern6有点稀疏的笔刷图案
    Qt::Dense6Pattern7非常稀疏的笔刷图案
    Qt::Dense7Pattern8极其稀疏的笔刷图案
    Qt::HorPattern9水平线
    Qt::VerPattern10垂直线
    Qt::CrossPattern11交叉水平线和垂直线
    Qt::BDiagPattern12后对角线
    Qt::FDiagPattern13向前对角线
    Qt::DiagCrossPattern14交叉对角线
    Qt::LinearGradientPattern15线性梯度QBrush
    Qt::ConicalGradientPattern17锥形梯度QBrush
    Qt::RadialGradientPattern16径向梯度QBrush
    Qt::TexturePattern24自定义图案

    在这里插入图片描述

    五.坐标系系统

    绘制设备的默认坐标系的原点位于左上角。x值向右增加,y值向下增加。默认单位是基于像素的设备上的一个像素,打印机上的一点(1/72英寸)。
    逻辑QPainter 坐标到物理 QPaintDevice 坐标的映射由QPainter 的变换矩阵、视口和“窗口”处理。默认情况下,逻辑坐标系和物理坐标系重合。QPainter 还支持坐标变换(例如旋转和缩放)。

  • 相关阅读:
    ABAP Web dynpro layout动态可见
    哈夫曼树、哈夫曼编码/解码
    MySQL 表中数据的增删改查操作
    民生银行信用卡中心金融科技24届春招面经
    【mysql学习笔记22】索引
    Flask之路由(app.route)详解
    错误:ModuleNotFoundError: No module named ‘httplib‘
    springboot自动配置原理以及手动实现配置类
    Godot 和 VScode配置C#环境注意事项
    [极客大挑战 2019]HardSQL-1
  • 原文地址:https://blog.csdn.net/qq_30150579/article/details/133631566