Qt技巧笔记(十一):QCustomPlot图表绘制库配置与示例

Qt技巧笔记(十一):QCustomPlot图表绘制库配置与示例

1. QCustomPlot图表库介绍

QCustomPlot是一个基于Qt框架的开源图标绘制库,用于绘制各种类型的二维图表和科学可视化。它提供了丰富的提供绘图功能和灵活的定制选项,使用开发者能够轻松创建交互式和高度可定制的图标。以下是一些QCustomplot库的特点和功能:

  1. 多种图标类型QCustomPlot支持绘制各种常见的二维图表类型,包括散点图、线图、柱状图、饼图、等值线图等。你可以根据数据的特点选择合适的图表类型。

  2. 数据可视化:该库提供了丰富的功能可视化科学数据。可以通过绘制数据点、曲线、颜色映射(色标)和等值线图等。

  3. 交互式操作QCustomPlot支持交互式操作,允许用户通过鼠标与图表进行交互。你可以缩放、平移、选择数据点、显示工具提示等,以便用户对图表进行探索和分析。

  4. 定制选项: 该库提供了丰富的定制选项,可以根据需要调整图表的外观和行为。你可以设置轴的刻度、标签和范围,选择图例的位置和样式,自定义绘图元素的样式和颜色等。

  5. 轻量级和易于集成: QCustomPlot是一个轻量级的库,易于集成到现有的Qt应用程序中。它只依赖于Qt库本身,没有其他外部依赖,使得它成为一个方便和灵活的选择。

2.环境安装与配置

QCustomPlot的安装与配置非常灵活,主要有两种方式:直接集成源码(最简单常用)编译为动态库(便于多项目共享)。 以下是基于官方指南和常见实践的操作步骤,你可以在阅读过程中根据自己的需求(比如是刚开始学习,还是想为多个项目搭建统一环境)来重点关注对应的部分。

方法一:直接集成源码(最简单、最常用)

​ 这种方式是将库的源代码直接添加到你的项目中,与项目一起编译。合适大多数初学者和中小型项目。

  1. 下载源代码文件

    访问QCustomPlot 官方网站的下面的 下载页面,下载最新的QCustomPlot.tar.gz 压缩包。解压后,你会得到两个核心文件:qcustomplot.hqustomplot.cpp

  2. 将文件添加到Qt项目

    • 将上述两个文件复制到你的项目目录下。
    • Qt CreatorVS2022,右键点击项目的根目录,选择"添加现有文件..." (Add Existing Files...),然后选中刚才复制过来的qcustomplot.hqcustomplot.cpp
    • 添加后,你的项目结构树中会显示这两个文件,同时项目文件(.pro)中也会自动添加相应的HEADERSSOURCES 条目。
  3. 修改项目文件(.pro

    打开项目的 .pro 文件,找到 QT 变量,确保添加了 printsupport 模块。这是因为QCustomPlot在打印或导出图表时需要用到它。

    makefile 复制代码
    # 如果使用Qt5及以上版本,需要加上 printsupport
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
  4. 在界面中使用(提升法)

    这是官方推荐的在Qt Designer中使用QCustomPlot的方法。

    • 打开mainwindow.uiwidget.h文件,从显示部件列表中拖拽一个QWidget到窗口上你想放置图表的位置。

    • 右键点击这个刚放置的QWidget,选择"提升为..."(Promote to...)。

    • 在弹出的对话框,"提升的类名称"(Promoted class name)输入QCustomPlot。"头文件"(Header file)会自动提升为qcustomplot.h,如果不对可以手动修改。然后点击"添加" (Add),再点击"提升" (Promote)。

    • 完成后,这个控件就变成QCustomPlot图表控件。虽然在设计界面没什么变化,但运行时就会显示一个带有坐标轴和网格线的空白图表。

方法二:编译为动态库(适合多个项目共享)

如果你需要在多个Qt项目中重复使用QCustomPlot,将其编译成一个单独的库文件(.dll .so)会更方便,无需在每个项目里都重复编译源码。

  1. 获取并准备共享库项目

    从官网下载QCustomPlot-sharedlib.tar.gz并解压。进入其中的 sharedlib-compilation 目录,你会看到一个 .pro 项目文件,这是官方准备好的用于编译动态库的项目。

  2. 放置源码并编译

    将之前下载的 qcustomplot.hqcustomplot.cpp 复制到 sharedlib-compilation 目录下。然后用 Qt Creator 打开该目录下的 .pro 文件,直接编译即可。编译成功后,你会在 debugrelease 目录下得到库文件,例如在Windows上是 qcustomplotd2.dll(调试版)和 qcustomplot2.dll(发布版)。

  3. 在自己的项目中使用库

    • 新建一个文件夹(如thirdPart),将生成的.dll.so文件和qcustomplot.h头文件放进去。

    • 在你的项目.pro文件中,需要进行额外配置来告诉项目去哪找头文件和库文件。

      makefile 复制代码
      # ... 其他配置 ...
      # 定义使用库
      DEFINES += QCUSTOMPLOT_USE_LIBRARY
      # 指定头文件路径
      INCLUDEPATH += ../thirdPart
      # 根据编译模式链接对应的库文件
      CONFIG(debug, release|debug){
          win32:QCPLIB = qcustomplotd2
          else: QCPLIB = qcustomplotd
      } else {
          win32:QCPLIB = qcustomplot2
          else: QCPLIB = qcustomplot
      }
      LIBS += -L../thirdPart -l$$QCPLIB
      # ... 其他配置 ...

      完成这些后,你就可以像方式一样,在UI界面中使用"提升法"来使用QCustomPlot了。

3.应用示例

基本绘图示例:其头文件mainwindow.h

C++ 复制代码
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "qcustomplot.h"

namespace Ui {
class MainWindow;
}

class QCustomPlot;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void setupQuadraticDemo(QCustomPlot *customPlot);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

其源文件mainwindow.cpp

C++ 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QCustomPlot* customPlot = new QCustomPlot;
    setCentralWidget(customPlot);

    setupQuadraticDemo(customPlot);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::setupQuadraticDemo(QCustomPlot *customPlot)
{
    QVector<double> x(101), y(101);
    for (int i = 0; i < 101; ++i) {
        x[i] = i / 50.0 - 1; // -1 到 1
        y[i] = x[i] * x[i];
    }

    customPlot->addGraph(); // 添加一个曲线图QGraph
    customPlot->graph(0)->setData(x, y); // 为曲线图添加数据
    customPlot->graph(0)->setName(QString::fromLocal8Bit("customplot_quadratic_demo")); // 设置曲线图的名字
    customPlot->xAxis->setLabel("x"); // 设置x和y轴的标签
    customPlot->yAxis->setLabel("y");
    customPlot->xAxis->setRange(-1, 1); // 设置x轴的范围为(-1,1)
    customPlot->yAxis->setRange(0, 1);
    customPlot->legend->setVisible(true); // 显示图例
}