QCustomPlot绘图库结构分析

张开发
2026/4/5 15:01:45 15 分钟阅读

分享文章

QCustomPlot绘图库结构分析
图层列表按顺序管理着所有用于绘制不同内容的图层。布局系统一个顶级的网格布局plotLayout负责所有可见元素如坐标矩形、图例的自动定位和尺寸调整。各种图元包括用于展示数据的plottable(如曲线、柱状体)和用于标识、装饰的items(如文本、箭头)。下面的表格为你梳理了构成QCustomPlot的核心类以及各自得作用核心积木基类主要用途常见子类举例图层 (Layer)QCPLayer控制不同元素的绘制顺序实现分层渲染背景层、网格层、主图层、坐标轴层等可绘制对象 (Layerable)QCPLayerable所有可绘制元素的总基类必须属于某个图层几乎所有下面的类都派生自它数据图元 (Plottable)QCPAbstractPlottable用于绘制和展示具体的数据系列QCPGraph(折线图)、QCPBars(柱状图)标识图元 (Item)QCPAbstractItem用于添加辅助性的图形或文字标记通常不与数据强绑定QCPItemLine(线段)、QCPItemText(文本)布局元素 (Layout Element)QCPLayoutElement可被布局系统管理的元素用于界面结构组织QCPAxisRect(坐标轴矩形)、QCPLegend(图例)其官方架构图类关系图has one/multiplecontains and defines orderinheritsinheritsinheritsinheritshas one/multipleis ahas onehas oneis itself ahas one as insetLayout()usually has onehas multipleis aQCustomPlotQCPLayerQCPLayerableQCPAbstractItemQCPItemAnchorQCPItemPositionQCPAxisQCPRangeQCPGridQCPAbstractPlottableQCPLayoutElementQCPLayoutGridQCPLayoutInsetQCPLegendQCPAbstractLegendItemQCPPlottableLegendItem其中QCustomPlot是一个图表包含一个或多个图层、一个或多个item例如文本、线段等、一个或多个可以绘制的元素、一个布局QCPLayer是一个图层包含基本的元素QCPLayerableQCPAbstractItem是标识图元虚基类QCPAbstractPlottable是数据展示图元虚基类QCPLayoutGrid是一个网格布局可以插入QCPLayoutElement元素文本元素QCPTextElement、坐标轴矩形QCPAxisRectQCPLayerableQCPAbstractPlottableQCPAbstractItemQCPLayoutElementQCPGridQCPAxisQCPGraphQCPCurveQCPBarsQCPStatisticalBoxQCPColorMapQCPFinancialQCPItemStraightLineQCPItemLineQCPItemCurveQCPItemRectQCPItemEllipseQCPItemTextQCPItemBracketQCPItemTracerQCPItemPixmapQCPAbstractLegendItemQCPLayoutQCPAxisRectQCPTextElementQCPColorScaleQCPPlottableLegendItemQCPLayoutGridQCPLayoutInsetQCPLegend在一个QCustomPlot类图中最重要且用的最多的是QCPLayerable元素几乎除了QCPLayer以外的元素都是继承自该类;QCPAbstractPlottable数据展示图元包含QCPGraph(折线图)、QCPCurve(曲线图)、QCPBars(柱状图)、QCPStatiBox(盒子图)、QCPColorMap(色谱图)、QCPFinancial(金融图)QCPAbstractItem标识图元包含直线(QCPItemStraightLine)、线段(QCPItemLine)、曲线(QCPItemCurve)、矩形(QCPItemRect)、椭圆(QCPItemEllipse)、文本(QCPItemText)、小圆球(QCPItemTracer)、图片(QCPItemPixmap)、括弧(QCPItemBracket)QCPLayoutElement布局项QCPGrid网格线每一个坐标轴对应一个网格线QCPAxis坐标轴一个坐标轴矩形包含四个坐标轴上下左右四个坐标轴由此可以看出QCustomPlot的几个设计原则1.核心继承关系一切始于 QCPLayerable​ 当你深入查看类继承图时会发现几乎所有能在画布上显示出来的东西都有一个共同的祖先——QCPLayerable可分层对象。这种设计的精妙之处在于它将绘制内容与绘制层次这两个概念解耦了。任何QCPLayerable的派生类都可以被分配到一个QCPLayer上从而控制它在最终图像中的上下位置。从这个基类出发主要衍生出三大功能分支QCPAbstractPlottable(数据图元)这是所有数据系列的抽象基类。你通过它来展示数据比如用QCPGraph画一条股价走势线或用QCPBars画一个销售统计柱状图。QCPAbstractItem(标识图元)这是一个用于添加装饰和说明的抽象基类。它不像plottable那样必须绑定在数据坐标系上位置可以更灵活。你可以用它在图表上画一条直线 (QCPItemLine)、添加一个文本框 (QCPItemText) 或一个箭头标记 (QCPItemTracer)。QCPLayoutElement(布局元素)这个分支让QCustomPlot具备了像Qt布局一样的能力。所有需要参与自动布局的对象如承载坐标轴的矩形框 (QCPAxisRect)、图例 (QCPLegend)都继承于此。2.图层系统控制渲染的先后顺序QCustomPlot的一大特色就是它的图层系统。你可以把它想象成Photoshop的图层QCustomPlot维护着一个有序的图层列表。在绘制时它会从列表的最底层开始由下往上依次绘制每个图层上的所有对象。新创建的QCustomPlot默认有六个图层顺序如下下层在上层之前绘制background背景层通常用于放置坐标轴矩形的背景。grid网格层绘制坐标轴的网格线。main主绘图层默认情况下新创建的plottable如曲线和item都会被添加到此层。axes坐标轴层绘制坐标轴的轴线、刻度和标签。legend图例层绘制图例。overlay覆盖层最顶层通常用于绘制鼠标选择框等临时元素。你可以通过QCPLayerable::setLayer()将任意一个layerable对象移动到任意图层也可以通过QCustomPlot::moveLayer()来调整图层本身的顺序从而实现复杂的显示效果。3.布局系统自动化管理元素位置除了通过图层控制绘制顺序QCustomPlot还通过一套布局系统来控制各个元素如坐标轴矩形、图例、图表标题的位置和尺寸。顶层布局每个QCustomPlot对象都有一个顶级的QCPLayoutGrid即plotLayout。它是一个网格布局默认只有一个单元格里面放着你最常用的QCPAxisRect坐标轴矩形。灵活的扩展你可以通过操作这个顶层布局来构建更复杂的界面。例如你可以在第0行插入一个单元格放置一个QCPTextElement作为图表标题也可以添加一个新的轴矩形将多个图表并排显示。图例 (QCPLegend) 本身也是一个布局元素可以被移动到主布局中实现图例在图表外部显示的效果。

更多文章