目录
`QCustomPlot` 是一个基于 Qt 的图表绘图库,用于在 Qt 应用程序中创建复杂的二维图表和图形。它非常适用于需要高性能、高度自定义和专业图表功能的应用程序。`QCustomPlot` 提供了丰富的功能,包括支持多种图表类型、数据点标记、坐标轴刻度、自定义样式等。
绘图表
Plottables 是在 QCustomPlot 中显示任何类型的数据的类。它们都派生自 QCPAbstractPlottable。例如,QCPGraph 是一个绘图表,它显示具有不同线条样式、散点样式、填充等的图形。
由于绘制图形是一个如此主要的用例,QCustomPlot 有一个特殊的接口用于处理 QCPGraph 绘图表,这使得处理它们变得非常容易:
可以使用 QCustomPlot::addGraph 创建新图形,并使用 QCustomPlot::graph 访问。
对于所有其他 plottable,使用正常的 plottable 接口:首先,创建相应 plottable 的实例并将其添加到 QCustomPlot,例如
然后,可以通过指针访问新创建的 plottable 的属性。newCurve
绘图表(包括图形)可以通过 QCustomPlot::p lottable 进行检索。由于该函数的返回类型是所有 plottables 的抽象基类 QCPAbstractPlottable,因此您可能希望返回指向相应 plottable 子类的指针。像往常一样,如果绘图表不属于该特定子类,则演员表将返回。qobject_cast
nullptr
所有与绘图表的进一步接口(例如,如何设置数据)都特定于绘图表类型。请参阅子类的文档:QCPGraph、QCPCurve、QCPBars、QCPStatisticalBox、QCPColorMap、QCPFinancial。
控制轴
QCustomPlot 有四个默认轴:xAxis(底部)、yAxis(左)、xAxis2(顶部)、yAxis2(右)。
它们的范围由简单的 QCPRange 类处理,该类基本上包含下轴和上轴坐标。您可以使用 QCPAxis::setRange 函数设置范围。若要将轴刻度类型从线性刻度更改为对数刻度,请将 QCPAxis::setScaleType 设置为 QCPAxis::stLogarithmic。在这种情况下,您还需要对数间隔的刻度和刻度标签,因此请使用 QCPAxis::setTicker 将轴行情设置为 QCPAxisTickerLog 实例。
每个轴都可以带有 QCPAxis::setLabel 的轴标签(例如“电压 (mV)”)。
默认情况下,轴会自动以合理的方式创建和标记刻度。请参阅 QCPAxis 文档中的各种方法进行微调。可以通过 QCPAxis::setTicks 禁用轴的即时报价。如果您只想隐藏刻度标签(数字),请使用 QCPAxis::setTickLabels。请注意,默认的右轴和上轴以隐藏的刻度标签开始。
轴主干到相应视口/小组件边界的距离称为其边距。通常,边距是自动计算的,以适应轴和刻度标签。要更改此设置,请设置 QCPAxisRect::setAutoMargins 以排除相应的边距边距,并使用 QCPAxisRect::setMargins 手动设置边距。可以使用 QCustomPlot::axisRect() 访问主轴矩形。QCPAxisRect 和 QCPAxis 文档中提供了不同边距/填充/偏移选项的详细说明。
剧情图例
默认情况下,每个 QCustomPlot 都有一个 QCPLegend(作为 QCustomPlot::legend)。图例是绘图中的一个小布局元素,它列出了绘图表,其中包含可绘图行/符号的图标和名称 (QCPAbstractPlottable::setName)。可以通过 QCPAbstractPlottable::addToLegend 和 QCPAbstractPlottable::removeFromLegend 在图例中添加和删除 Plottable。默认情况下,向 QCustomPlot 添加 plottable 也会自动将其添加到图例中。可以使用 QCustomPlot::setAutoAddPlottableToLegend 属性更改此行为。
QCPLegend 也提供了一个接口,可以直接访问、添加和删除图例项。请参阅 QCPLegend::item、QCPLegend::itemWithPlottable、QCPLegend::addItem、QCPLegend::removeItem 示例。
布局系统支持多个图例(因为 QCPLegend 是普通布局元素)。
用户交互
QCustomPlot 支持使用鼠标拖动轴范围 (QCPAxisRect::setRangeDrag)、使用鼠标滚轮缩放轴范围 (QCPAxisRect::setRangeZoom) 以及完整的选择机制,可配置细化到数据点和数据范围。
这些交互的可用性通过 QCustomPlot::setInteractions 进行控制。有关交互系统的详细信息,请参阅那里的文档。数据选择在专用的数据选择机制页面上进行了详细讨论。
此外,当对象被点击或双击时,QCustomPlot 总是发出相应的信号。例如,请参见 QCustomPlot::p lottableClick、QCustomPlot::p lottableDoubleClick 和 QCustomPlot::axisClick。
最后,在最低级别,您可以在自己的子类中使用 QCPLayerable 鼠标事件虚拟方法,QCustomPlot 实例在受影响的可分层对象上调用该方法。
装饰品及辅助物品
除了可绘图对象之外,还有另一类重要的绘图对象:项目。所有项的基类都是 QCPAbstractItem。项目与可绘图表的不同之处在于,它不一定绑定到任何轴。这意味着它也可以放置在绝对像素坐标中,或放置在轴矩形的相对位置。此外,它通常不直接表示数据,而是充当装饰、强调、描述等。
可以在父-子-层次结构中安排多个项目,从而允许动态行为。例如,您可以将箭头的头部放置在固定的绘图坐标处,以便它始终指向绘图中的某个重要区域。箭头的尾部可以锚定到文本项,该文本项始终位于轴矩形的顶部中心,与用户拖动轴范围的位置无关。这样,箭头可以拉伸和旋转,因此它始终从标签指向指定的绘图坐标,而无需任何进一步的代码。
有关更详细的介绍,请参阅 QCPAbstractItem 文档,并从那里查看各个标准项的文档,以了解如何使用它们。
布局元素和布局
QCustomPlot 使用内部布局系统来提供对象的动态大小调整和定位,例如轴矩形、图例、色阶和其他布局元素。它们都基于 QCPLayoutElement,并通过将它们放在 QCPLayout 子类(如 QCPLayoutGrid)中来排列。
有关详细信息,请参阅有关布局系统的页面。
OpenGL 加速绘图和性能改进
QCustomPlot 具有多个 OpenGL 后端,可在所有受支持的 Qt 版本上提供 OpenGL 硬件加速绘图。如果计算机支持 OpenGL,则可以通过在相应的 QCustomPlot 实例上使用 setOpenGl(true) 进行编译并调用来启用它。该方法的文档中提供了更多详细信息。QCUSTOMPLOT_USE_OPENGL
有关在要求苛刻的可视化任务中最大限度地提高绘图性能的信息,可以在有关绘图性能改进的专用页面上找到。
预处理器定义标志
QCustomPlot 了解一些用于调试和编译的预处理器定义。必须在包含 QCustomPlot 标头之前定义标志。通常最好将它们添加到您的 qmake 项目文件中,例如使用DEFINES += QCUSTOMPLOT_USE_OPENGL
QCUSTOMPLOT_USE_OPENGL
如果定义了此标志,则 QCustomPlot 可以使用 OpenGL 来提高图形要求高的绘图的绘图性能,请参阅 QCustomPlot::setOpenGl。
QCUSTOMPLOT_COMPILE_LIBRARY
在将 QCustomPlot 编译为共享库 (.so/.dll) 时定义此标志
QCUSTOMPLOT_USE_LIBRARY
在使用 QCustomPlot 作为共享库时,在包含标头之前定义此标志
QCUSTOMPLOT_CHECK_DATA
如果定义了此标志,则 QCustomPlot 绘图表将在每次重绘时执行数据有效性检查。当遇到 inf 或 nan 值时,它们将给出 qDebug 输出(如果故意使用无声 NaN 在图形中创建间隙也是如此)。
### 特点
- **多种图表类型**:折线图、柱状图、散点图、曲线图、饼图等。
- **自定义样式**:可以自定义图表的颜色、线型、标记等。
- **高性能**:适用于实时数据更新和大数据集。
- **易用性**:简单的 API 设计,使得用户可以快速创建和修改图表。
### 使用步骤
以下是如何在 Qt 项目中使用 `QCustomPlot` 的基本步骤:
1. **安装 QCustomPlot**
- 访问 [QCustomPlot 官网](https://www.qcustomplot.com/) 下载最新版本的 `QCustomPlot` 库。
- 将下载的 `qcustomplot.h` 和 `qcustomplot.cpp` 文件添加到您的 Qt 项目中。
2. **配置项目文件**
在您的 Qt 项目的 `.pro` 文件中,添加以下内容以包含 `QCustomPlot` 的头文件和源文件:
```pro
HEADERS += path/to/qcustomplot.h
SOURCES += path/to/qcustomplot.cpp
```
3. **使用 QCustomPlot**
在 Qt 的主窗口或者其他 Qt Widget 中使用 `QCustomPlot` 组件。下面是一个简单的示例,展示了如何在 Qt 的窗口中创建一个基本的折线图。
```cpp
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qcustomplot.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建一个 QCustomPlot 实例
QCustomPlot *customPlot = new QCustomPlot(this);
setCentralWidget(customPlot);
// 添加折线图
QCPGraph *graph = customPlot->addGraph();
graph->setName("Sample Data");
// 添加数据
QVector<double> xData(101), yData(101);
for (int i = 0; i < 101; ++i)
{
xData[i] = i / 50.0 - 1; // X 数据
yData[i] = xData[i] * xData[i]; // Y 数据
}
graph->setData(xData, yData);
// 设置坐标轴标签
customPlot->xAxis->setLabel("X Axis");
customPlot->yAxis->setLabel("Y Axis");
// 自动缩放
customPlot->rescaleAxes();
}
MainWindow::~MainWindow()
{
delete ui;
}
```
```cpp
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "qcustomplot.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
```
4. **自定义和扩展**
`QCustomPlot` 提供了丰富的接口和功能来进一步自定义和扩展图表。例如,可以添加多个图表、修改颜色、设置图例、处理鼠标事件等。可以参考 [QCustomPlot 的官方文档](https://www.qcustomplot.com/documentation/) 获取更多详细信息和示例代码。
### 总结
`QCustomPlot` 是一个功能强大且灵活的 Qt 图表库,适合需要高度自定义和高性能图表的应用程序。通过简单的配置和代码编写,您可以轻松地在 Qt 项目中创建和展示各种图表。