文档

Qt-UI ChartKit 文档

Qt数据可视化的自定义图表控件。

产品概览

Qt-UI ChartKit

ChartKit 是面向 Qt Widget 桌面程序的数据可视化控件库。当前图表控件采用自绘 OpenGL 渲染体系,对外暴露 ChartKit 自身的控件类与数据结构。业务代码应通过 ChartKit 的公开控件方法设置数据、主题和交互。

基类结构

ChartKit 的核心基类是 UIGQChartBase

类型 说明
UIGQChartBase 图表渲染基类,继承 QOpenGLWidget,负责主题、图例位置、背景、动画和 tooltip overlay。
IUIGQWidgetBase Qt-UI 控件统一接口,图表控件通过它接入 WidgetKit 的控件注册、JSON、布局和样式体系。
UIGQChartTheme 图表主题结构,包含背景、绘图区、标题、坐标轴、网格线、hover guide 和调色板。

类图

QWidget
  └─ QOpenGLWidget
      └─ UIGQtLib::UIGQChartBase
          ├─ UIGQtLib::UIGQLineChart      + IUIGQWidgetBase
          ├─ UIGQtLib::UIGQBarChart       + IUIGQWidgetBase
          ├─ UIGQtLib::UIGQOpenGLPieChart + IUIGQWidgetBase
          └─ UIGQtLib::UIGQScatterChart   + IUIGQWidgetBase

当前图表类型

图表 控件类 typeName 数据入口
折线图 UIGQLineChart qtlinechart setCategories(...) + setSeries(...)
柱状图 UIGQBarChart qtbarchart setCategories(...) + setSeries(...)
饼图 UIGQOpenGLPieChart qtopenglpiechart setSlices(...)
散点图 UIGQScatterChart qtscatterchart setSeries(...)

通用调用顺序

  1. 创建图表控件并加入父容器。
  2. 设置标题、分类、数据 series 或 slices。
  3. 设置主题、图例位置、背景、动画和 tooltip。
  4. 业务数据变化时重新调用 setSeries(...)setSlices(...)
using namespace UIGQtLib;

auto* chart = new UIGQLineChart(parent);
chart->setTitle("Revenue Trend");
chart->setCategories({"Q1", "Q2", "Q3", "Q4"});
chart->setSeries("Revenue", {120.0, 160.0, 148.0, 210.0}, QColor(35, 128, 224));
chart->setThemePreset(kChartThemeMacarons);
chart->setLegendPosition(kChartLegendBottom);
chart->setTooltipVisible(true);
chart->setHoverEnabled(true);

调用入口

业务代码应调用 ChartKit 控件公开的 setSeries(...)setCategories(...)setSlices(...)setThemePreset(...) 等方法。图表内部渲染对象由控件管理,不作为业务 API 暴露。

快速接入

快速开始

本节使用真实的 ChartKit 公开接口创建一个折线图。ChartKit 图表控件本身就是 QWidget,可直接放入 Qt Widget 页面、布局或 Qt-UI 容器中。

1. 引入头文件

#include "UIGQLineChart.h"
#include "UIGQChartTheme.h"

如果需要其它图表类型,引入对应头文件:

#include "UIGQBarChart.h"
#include "UIGQOpenGLPieChart.h"
#include "UIGQScatterChart.h"

2. 创建图表

using namespace UIGQtLib;

auto* chart = new UIGQLineChart(parent);
chart->setMinimumSize(640, 360);
chart->setTitle("Monthly Orders");

调用说明:

方法 说明 参数 返回值
new UIGQLineChart(parent) 创建折线图控件,并交给 Qt 父子对象生命周期管理。 parent:父 QWidget,可为 nullptr UIGQLineChart*
setMinimumSize(int minw, int minh) 设置控件最小尺寸,避免布局压缩导致图表不可读。 minw:最小宽度;minh:最小高度。 void
setTitle(const QString& title) 设置图表标题。 title:标题文本。 void

3. 设置分类和数据

chart->setCategories({"Jan", "Feb", "Mar", "Apr", "May"});
chart->setSeries("Orders", {128, 152, 176, 163, 209}, QColor(35, 128, 224));

调用说明:

方法 说明 参数 返回值
setCategories(const QStringList& categories) 设置 X 轴分类标签。 categories:分类名称列表。 void
setSeries(const QString& name, const QVector<double>& values, const QColor& color) 设置单条数据序列,适合快速接入。 name:序列名称;values:数值列表;color:序列颜色,可使用默认值。 void

4. 设置主题和交互

chart->setThemePreset(kChartThemeMacarons);
chart->setLegendPosition(kChartLegendBottom);
chart->setTooltipMode(kChartTooltipItem);
chart->setTooltipVisible(true);
chart->setHoverEnabled(true);
chart->setAnimationEnabled(true);

调用说明:

方法 说明 参数 返回值
setThemePreset(UIGQChartThemePreset preset) 使用内置主题预设。 preset:主题预设枚举。 void
setLegendPosition(UIGQChartLegendPosition position) 设置图例位置。 position:图例位置枚举。 void
setTooltipMode(UIGQChartTooltipMode mode) 设置 tooltip 行为。 modekChartTooltipNonekChartTooltipItemkChartTooltipAxis void
setTooltipVisible(bool visible) 控制 tooltip 是否显示。 visible:是否显示。 void
setHoverEnabled(bool enabled) 控制鼠标 hover 交互。 enabled:是否启用 hover。 void
setAnimationEnabled(bool enabled) 控制数据绘制动画。 enabled:是否启用动画。 void

5. 更新数据

业务数据变化时,不要操作内部 QtCharts 对象,直接重新设置 ChartKit 数据:

chart->setSeries("Orders", latestValues, QColor(35, 128, 224));
chart->restartAnimation();

restartAnimation() 用于在数据刷新后重新播放图表动画。

使用指南

使用指南

ChartKit 的调用模型是“控件 + 数据结构 + 主题”。业务代码只需要准备分类、数值、点位或切片数据,再交给对应图表控件。

基类能力

所有当前 ChartKit 图表都继承 UIGQChartBase,并提供以下通用能力:

方法 说明 参数 返回值
setThemePreset(UIGQChartThemePreset preset) 使用内置主题预设。 presetkChartThemeDefaultkChartThemeMacaronskChartThemeShinekChartThemeDark void
getThemePreset() 读取当前主题预设。 无。 UIGQChartThemePreset
setTheme(const UIGQChartTheme& theme) 使用自定义主题结构。 theme:图表主题结构,包含背景、坐标轴、网格线、调色板等。 void
getTheme() 读取当前主题结构。 无。 const UIGQChartTheme&
setLegendPosition(UIGQChartLegendPosition position) 设置图例位置。 positionkChartLegendTopkChartLegendRightkChartLegendBottomkChartLegendLeft void
getLegendPosition() 读取当前图例位置。 无。 UIGQChartLegendPosition
setBackgroundColor(const QColor& color) 设置图表控件背景色。 color:背景颜色。 void
getBackgroundColor() 读取图表控件背景色。 无。 QColor
setAnimationEnabled(bool enabled) 开启或关闭动画。 enabled:是否启用动画。 void
getAnimationEnabled() 读取动画开关状态。 无。 bool
setAnimationDuration(int durationMs) 设置动画时长。 durationMs:动画时长,单位毫秒。 void
getAnimationDuration() 读取动画时长。 无。 int
restartAnimation() 数据更新后重新播放动画。 无。 void
getAnimationProgress() 读取当前动画进度。 无。 qreal
setTooltipOverlay(const QPoint& anchorPos, const QString& text) 设置 tooltip overlay。 anchorPos:提示框锚点;text:提示文本。 void
clearTooltipOverlay() 清除 tooltip overlay。 无。 void
hasTooltipOverlay() 判断当前是否存在 tooltip overlay。 无。 bool
drawTooltipOverlay(QPainter& painter) 绘制 tooltip overlay,通常由图表内部调用。 painter:绘制对象。 void

数据调用规范

图表类型 主要数据结构 推荐入口
折线图 UIGQLineChartSeries setCategories(...) + setSeries(...)
柱状图 UIGQBarChartSeries setCategories(...) + setSeries(...)
饼图 UIGQOpenGLPieChartSlice setSlices(...)
散点图 UIGQScatterChartSeries setSeries(...)

推荐调用流程

auto* chart = new UIGQBarChart(parent);

chart->setTitle("Policy Status");
chart->setCategories({"Active", "Expiring", "Invalid"});

QVector<UIGQBarChartSeries> series;
UIGQBarChartSeries item;
item.name = "Policies";
item.values = {420, 15, 30};
item.fillColor = QColor(35, 128, 224);
series.append(item);

chart->setSeries(series);
chart->setThemePreset(kChartThemeShine);
chart->setTooltipVisible(true);
chart->setHoverEnabled(true);

调用说明

  • setCategories(...) 与 values 的数量应保持一致;如果数量不同,图表会按可绘制的数据范围处理,业务侧仍建议保持一致。
  • 多序列图表使用 QVector<UIGQLineChartSeries>QVector<UIGQBarChartSeries>,不要重复访问内部 series。
  • clearSeries() / clearSlices() 用于清空当前数据。
  • setSeriesVisible(index, visible) 用于在不删除数据的情况下控制序列显示。
  • 主题相关设置建议放在初始化或全局主题切换流程中。

调用边界

当前 ChartKit 不以 QtCharts 内部对象作为业务调用入口。业务侧只需要维护数据结构、主题和交互参数,图表内部渲染对象由控件自行管理。

折线图

Line Chart 折线图

折线图用于展示连续数据趋势,适合监控曲线、业务指标走势、历史对比和时序数据分析。

基类与类图

QOpenGLWidget
  └─ UIGQChartBase
      └─ UIGQLineChart + IUIGQWidgetBase

UIGQLineChart 继承 UIGQChartBase 的主题、动画、图例和 tooltip 能力,并通过 IUIGQWidgetBase 接入 Qt-UI 控件体系。

数据结构

struct UIGQLineChartSeries
{
    QString name;
    QVector<double> values;
    QColor lineColor;
    QColor areaColor;
    bool showSymbol = true;
    bool smooth = false;
    bool showArea = false;
    bool visible = true;
    qreal lineWidth = 2.0;
    qreal areaOpacity = 0.22;
};

常用方法

方法 说明 参数 返回值
setTitle(const QString& title) 设置标题。 title:标题文本。 void
getTitle() 读取标题。 无。 QString
setCategories(const QStringList& categories) 设置分类标签。 categories:横轴分类列表。 void
getCategories() 读取分类标签。 无。 QStringList
setValues(const QVector<double>& values) 设置默认单序列数值。 values:数值列表。 void
getValues() 读取默认单序列数值。 无。 QVector<double>
setSeries(const QString& name, const QVector<double>& values, const QColor& color) 快速设置单条折线。 name:序列名称;values:数值列表;color:线条颜色,可使用默认值。 void
setSeries(const QVector<UIGQLineChartSeries>& series) 设置多条折线及每条线的显示参数。 series:折线序列数组。 void
getSeries() 读取当前折线序列。 无。 QVector<UIGQLineChartSeries>
clearSeries() 清空所有折线数据。 无。 void
setShowSymbol(bool show) 全局控制数据点符号。 show:是否显示数据点符号。 void
getShowSymbol() 读取数据点符号显示状态。 无。 bool
setSmooth(bool smooth) 全局控制是否使用平滑曲线。 smooth:是否平滑。 void
getSmooth() 读取平滑曲线状态。 无。 bool
setShowArea(bool show) 全局控制是否显示面积填充。 show:是否显示面积。 void
getShowArea() 读取面积填充状态。 无。 bool
setSeriesVisible(int index, bool visible) 控制指定序列显示或隐藏。 index:序列索引;visible:是否显示。 void
isSeriesVisible(int index) 判断指定序列是否显示。 index:序列索引。 bool
setTooltipMode(UIGQChartTooltipMode mode) 设置 tooltip 模式。 mode:tooltip 模式枚举。 void
getTooltipMode() 读取 tooltip 模式。 无。 UIGQChartTooltipMode
setTooltipVisible(bool visible) 设置 tooltip 是否显示。 visible:是否显示。 void
getTooltipVisible() 读取 tooltip 显示状态。 无。 bool
setHoverEnabled(bool enabled) 开启或关闭 hover 交互。 enabled:是否启用 hover。 void
getHoverEnabled() 读取 hover 交互状态。 无。 bool
initDemoData() 初始化演示数据。 无。 void

单序列调用

using namespace UIGQtLib;

auto* chart = new UIGQLineChart(parent);
chart->setTitle("CPU Usage");
chart->setCategories({"00:00", "00:05", "00:10", "00:15"});
chart->setSeries("CPU", {22.0, 35.0, 31.0, 48.0}, QColor(35, 128, 224));
chart->setSmooth(true);
chart->setShowSymbol(true);
chart->setThemePreset(kChartThemeMacarons);
chart->setTooltipMode(kChartTooltipAxis);
chart->setTooltipVisible(true);

调用说明:

  • setCategories(...) 设置横轴标签。
  • setSeries(...) 设置折线名称、数值和颜色。
  • setSmooth(true) 适合趋势类图表;精确折线可保持默认 false
  • kChartTooltipAxis 适合按横轴位置查看同一时刻的值。

多序列调用

QVector<UIGQLineChartSeries> series;

UIGQLineChartSeries cpu;
cpu.name = "CPU";
cpu.values = {22, 35, 31, 48};
cpu.lineColor = QColor(35, 128, 224);
cpu.showSymbol = true;
series.append(cpu);

UIGQLineChartSeries memory;
memory.name = "Memory";
memory.values = {58, 60, 63, 61};
memory.lineColor = QColor(62, 180, 98);
memory.showArea = true;
memory.areaColor = QColor(62, 180, 98, 80);
series.append(memory);

chart->setSeries(series);

调用说明:

  • 多序列使用 QVector<UIGQLineChartSeries> 一次性设置。
  • showAreaareaColor 用于面积趋势图。
  • visible 可配合 setSeriesVisible(...) 做图例筛选。

柱状图

Bar Chart 柱状图

柱状图用于分类数据对比、排行、统计汇总和分组指标展示。当前公开控件类为 UIGQBarChart,文档文件名保留 column-chart.md 是为了兼容既有页面链接。

基类与类图

QOpenGLWidget
  └─ UIGQChartBase
      └─ UIGQBarChart + IUIGQWidgetBase

UIGQBarChart 继承 UIGQChartBase,通过 ChartKit 自身的数据结构绘制柱状图。业务代码只需要设置分类、序列、主题和交互参数。

数据结构

struct UIGQBarChartSeries
{
    QString name;
    QVector<double> values;
    QColor fillColor;
    QColor borderColor;
    bool visible = true;
};

常用方法

方法 说明 参数 返回值
setTitle(const QString& title) 设置标题。 title:标题文本。 void
getTitle() 读取标题。 无。 QString
setCategories(const QStringList& categories) 设置分类标签。 categories:分类名称列表。 void
getCategories() 读取分类标签。 无。 QStringList
setValues(const QVector<double>& values) 设置默认单序列数值。 values:数值列表。 void
getValues() 读取默认单序列数值。 无。 QVector<double>
setSeries(const QString& name, const QVector<double>& values, const QColor& color) 快速设置单组柱状数据。 name:序列名称;values:数值列表;color:填充色,可使用默认值。 void
setSeries(const QVector<UIGQBarChartSeries>& series) 设置多组柱状数据。 series:柱状图序列数组。 void
getSeries() 读取当前柱状图序列。 无。 QVector<UIGQBarChartSeries>
clearSeries() 清空所有数据组。 无。 void
setSeriesVisible(int index, bool visible) 控制指定数据组显示或隐藏。 index:序列索引;visible:是否显示。 void
isSeriesVisible(int index) 判断指定数据组是否显示。 index:序列索引。 bool
setTooltipMode(UIGQChartTooltipMode mode) 设置 tooltip 模式。 mode:tooltip 模式枚举。 void
getTooltipMode() 读取 tooltip 模式。 无。 UIGQChartTooltipMode
setTooltipVisible(bool visible) 设置 tooltip 是否显示。 visible:是否显示。 void
getTooltipVisible() 读取 tooltip 显示状态。 无。 bool
setHoverEnabled(bool enabled) 开启或关闭 hover 交互。 enabled:是否启用 hover。 void
getHoverEnabled() 读取 hover 交互状态。 无。 bool
initDemoData() 初始化演示数据。 无。 void

单序列调用

using namespace UIGQtLib;

auto* chart = new UIGQBarChart(parent);
chart->setTitle("Policy Overview");
chart->setCategories({"Active", "Expiring Soon", "Need Validation", "Expired"});
chart->setSeries("Policies", {420, 15, 30, 12}, QColor(35, 128, 224));
chart->setThemePreset(kChartThemeShine);
chart->setLegendPosition(kChartLegendBottom);
chart->setTooltipMode(kChartTooltipItem);
chart->setTooltipVisible(true);
chart->setHoverEnabled(true);

调用说明:

  • setCategories(...) 定义每根柱子的分类名称。
  • setSeries(name, values, color) 适合只有一组统计值的场景。
  • kChartTooltipItem 适合查看单个柱子的分类和值。

多序列调用

QVector<UIGQBarChartSeries> series;

UIGQBarChartSeries current;
current.name = "Current";
current.values = {420, 15, 30, 12};
current.fillColor = QColor(35, 128, 224);
series.append(current);

UIGQBarChartSeries previous;
previous.name = "Previous";
previous.values = {390, 22, 28, 18};
previous.fillColor = QColor(62, 180, 98);
series.append(previous);

chart->setSeries(series);

调用说明:

  • 每个 UIGQBarChartSeries 表示一组柱状数据。
  • values 的顺序应与 categories 对齐。
  • fillColor 控制柱子填充色,borderColor 可用于强调边框。

饼图

Pie Chart 饼图

饼图用于展示整体中的占比关系,适合构成分析、分类占用、资源分布和摘要型数据呈现。当前公开控件类为 UIGQOpenGLPieChart

基类与类图

QOpenGLWidget
  └─ UIGQChartBase
      └─ UIGQOpenGLPieChart + IUIGQWidgetBase

数据结构

struct UIGQOpenGLPieChartSlice
{
    QString name;
    double value = 0.0;
    QColor fillColor;
    bool visible = true;
};

常用方法

方法 说明 参数 返回值
setTitle(const QString& title) 设置标题。 title:标题文本。 void
getTitle() 读取标题。 无。 QString
setSlices(const QVector<UIGQOpenGLPieChartSlice>& slices) 设置饼图切片。 slices:切片数组。 void
getSlices() 读取饼图切片。 无。 QVector<UIGQOpenGLPieChartSlice>
clearSlices() 清空所有切片。 无。 void
setInnerRadiusRatio(qreal ratio) 设置内半径比例,0 为普通饼图,大于 0 为环图。 ratio:内半径比例。 void
getInnerRadiusRatio() 读取内半径比例。 无。 qreal
setAngleRange(qreal startAngleDegrees, qreal spanAngleDegrees) 设置起始角度和绘制角度范围。 startAngleDegrees:起始角度;spanAngleDegrees:角度跨度。 void
getStartAngle() 读取起始角度。 无。 qreal
getSpanAngle() 读取角度跨度。 无。 qreal
setLeaderLineVisible(bool visible) 控制引导线显示。 visible:是否显示。 void
getLeaderLineVisible() 读取引导线显示状态。 无。 bool
setTooltipMode(UIGQChartTooltipMode mode) 设置 tooltip 模式。 mode:tooltip 模式枚举。 void
getTooltipMode() 读取 tooltip 模式。 无。 UIGQChartTooltipMode
setTooltipVisible(bool visible) 设置 tooltip 是否显示。 visible:是否显示。 void
getTooltipVisible() 读取 tooltip 显示状态。 无。 bool
setHoverEnabled(bool enabled) 开启或关闭 hover 交互。 enabled:是否启用 hover。 void
getHoverEnabled() 读取 hover 交互状态。 无。 bool
initDemoData() 初始化演示数据。 无。 void

基础调用

using namespace UIGQtLib;

auto* chart = new UIGQOpenGLPieChart(parent);
chart->setTitle("Traffic Sources");

QVector<UIGQOpenGLPieChartSlice> slices;

UIGQOpenGLPieChartSlice search;
search.name = "Search";
search.value = 1048;
search.fillColor = QColor(35, 128, 224);
slices.append(search);

UIGQOpenGLPieChartSlice direct;
direct.name = "Direct";
direct.value = 735;
direct.fillColor = QColor(62, 180, 98);
slices.append(direct);

chart->setSlices(slices);
chart->setThemePreset(kChartThemeMacarons);
chart->setTooltipMode(kChartTooltipItem);
chart->setTooltipVisible(true);
chart->setHoverEnabled(true);

调用说明:

  • setSlices(...) 是饼图的数据入口。
  • 每个 UIGQOpenGLPieChartSlice 表示一个切片。
  • value 用于计算占比,业务侧不需要提前计算百分比。

环图和角度控制

chart->setInnerRadiusRatio(0.55);
chart->setAngleRange(90.0, 360.0);
chart->setLeaderLineVisible(true);

调用说明:

  • setInnerRadiusRatio(0.55) 将饼图变为环图。
  • setAngleRange(...) 可用于半圆图、仪表盘式占比或特殊视觉呈现。
  • setLeaderLineVisible(true) 适合标签较多的构成分析图。

散点图

Scatter Chart 散点图

散点图用于观察两个变量之间的分布关系,适合相关性分析、聚类观察、异常点识别和样本分布展示。

基类与类图

QOpenGLWidget
  └─ UIGQChartBase
      └─ UIGQScatterChart + IUIGQWidgetBase

数据结构

struct UIGQScatterChartSeries
{
    QString name;
    QVector<QPointF> points;
    QColor color;
    bool visible = true;
    qreal symbolSize = 8.0;
};

常用方法

方法 说明 参数 返回值
setTitle(const QString& title) 设置标题。 title:标题文本。 void
getTitle() 读取标题。 无。 QString
setSeries(const QVector<UIGQScatterChartSeries>& series) 设置散点序列。 series:散点序列数组。 void
getSeries() 读取散点序列。 无。 QVector<UIGQScatterChartSeries>
clearSeries() 清空所有序列。 无。 void
setSeriesVisible(int index, bool visible) 控制指定序列显示或隐藏。 index:序列索引;visible:是否显示。 void
isSeriesVisible(int index) 判断指定序列是否显示。 index:序列索引。 bool
setTooltipMode(UIGQChartTooltipMode mode) 设置 tooltip 模式。 mode:tooltip 模式枚举。 void
getTooltipMode() 读取 tooltip 模式。 无。 UIGQChartTooltipMode
setTooltipVisible(bool visible) 设置 tooltip 是否显示。 visible:是否显示。 void
getTooltipVisible() 读取 tooltip 显示状态。 无。 bool
setHoverEnabled(bool enabled) 开启或关闭 hover 交互。 enabled:是否启用 hover。 void
getHoverEnabled() 读取 hover 交互状态。 无。 bool
initDemoData() 初始化演示数据。 无。 void

基础调用

using namespace UIGQtLib;

auto* chart = new UIGQScatterChart(parent);
chart->setTitle("Validation Samples");

QVector<UIGQScatterChartSeries> series;

UIGQScatterChartSeries passed;
passed.name = "Passed";
passed.points = {QPointF(12, 80), QPointF(18, 88), QPointF(25, 91)};
passed.color = QColor(62, 180, 98);
passed.symbolSize = 8.0;
series.append(passed);

UIGQScatterChartSeries warning;
warning.name = "Warning";
warning.points = {QPointF(10, 52), QPointF(20, 58), QPointF(28, 61)};
warning.color = QColor(232, 148, 54);
warning.symbolSize = 10.0;
series.append(warning);

chart->setSeries(series);
chart->setThemePreset(kChartThemeShine);
chart->setTooltipMode(kChartTooltipItem);
chart->setTooltipVisible(true);
chart->setHoverEnabled(true);

调用说明:

  • points 中的 QPointF(x, y) 表示散点坐标。
  • 每个 UIGQScatterChartSeries 表示一个分组。
  • symbolSize 控制散点半径大小,适合强调不同分组。
  • setSeriesVisible(...) 可用于图例筛选或用户切换分组。

授权说明

License

ChartKit provides community, annual commercial, and permanent commercial editions.

Choose the edition according to your project scope, update expectations, and support needs.