您的位置:

QCustomPlot使用教程

一、QCustomPlot介绍

QCustomPlot是用于绘制图表的Qt C++绘图库。它提供了多种基本绘图元素,如曲线、数据点、坐标轴、网格、标签等,并支持实时数据可视化。它还支持丰富的交互,如缩放、平移、选择区域、响应鼠标事件等。

QCustomPlot的安装也很容易,在Qt中实现安装只需要两步:首先,下载并解压缩源代码包;其次,在Qt项目中包含所需的头文件和链接到共享库。

二、绘制曲线

QCustomPlot可以很容易地绘制多个曲线。以下示例显示如何绘制两个简单的曲线。

QCustomPlot customPlot;
customPlot.addGraph();
customPlot.graph(0)->setData(x, y); // x和y是数据集
customPlot.addGraph();
customPlot.graph(1)->setData(x, z); // z是第二组数据集
customPlot.replot();

要为曲线设置样式和绘制属性,可以使用QPen。例如,以下代码将设置第一条曲线的颜色为红色:

customPlot.graph(0)->setPen(QPen(Qt::red));

三、坐标轴和标签

QCustomPlot提供了两个主坐标轴和两个次坐标轴。以下代码创建了一个简单的图形,并在其上方添加了一个标题和标题:

QCustomPlot customPlot;
customPlot.plotLayout()->insertRow(0); // 添加一个行以放置标题
customPlot.plotLayout()->addElement(0, 0, new QCPTextElement(customPlot,
    "My Plot Title", QFont("sans", 12, QFont::Bold)));
customPlot.xAxis->setLabel("x Axis Label");
customPlot.yAxis->setLabel("y Axis Label");
customPlot.addGraph();
//设置x,y坐标轴范围
customPlot.xAxis->setRange(0, 10);
customPlot.yAxis->setRange(0, 1);
customPlot.graph(0)->setData(x, y);
customPlot.replot();

四、实时数据显示

QCustomPlot支持实时数据可视化,即当新数据点可用时,可以将它们添加到已绘制的曲线上。以下示例显示了如何使用QTimer添加新数据点。

// 创建定时器
QTimer dataTimer;
// 连接定时器的timeout()信号到槽函数,每个周期发射一次timeout()信号
connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
dataTimer.start(0); // 参数为0可尽可能快地执行定时器任务

数据槽函数(realtimeDataSlot())将生成新数据点并将它们添加到图形中:

void MainWindow::realtimeDataSlot()
{
    // 计算新的数据点
    double key = QDateTime::currentDateTime().toMSecsSinceEpoch()/1000.0;
    static double lastPointKey = 0;
    if (key-lastPointKey > 0.01) // 为了使数据点之间不相互重叠
    {
        // 生成新的x,y数据
        double value0 = qSin(key*1.6)*qCos(key*1.4)*10 + qSin(key*0.6)*5;
        double value1 = qSin(key*1.2)*qCos(key*0.9)*10 + qSin(key*0.2)*7.5;
        // 将新数据点添加到曲线中
        ui->customPlot->graph(0)->addData(key, value0);
        ui->customPlot->graph(1)->addData(key, value1);
        // 移动坐标轴范围(使其保持滑动窗口效果)
        ui->customPlot->xAxis->setRange(key, 8, Qt::AlignRight);
        ui->customPlot->replot();
        lastPointKey = key;
    }
}

五、交互和事件

QCustomPlot提供了许多交互功能,例如放大、缩小、选择区域、平移等,可以通过setInteractions函数设置。例如,以下代码显示如何启用缩放和平移功能:

customPlot.setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);

可以利用事件处理函数绑定一些响应鼠标事件的操作。例如,以下代码显示如何按下鼠标左键缩放y轴:

// 声明一个double值,记录鼠标按下时y坐标轴的范围下限
double yMin = 0;
// 重写mousePress事件,该事件在鼠标按下时调用
void MainWindow::mousePress(QMouseEvent *event)
{
    // 如果事件是鼠标左键按下
    if (event->button() == Qt::LeftButton)
    {
        // 记录当前y坐标轴范围下限
        yMin = ui->customPlot->yAxis->range().lower;
    }
}
// 重写mouseMove事件,该事件在鼠标移动时调用
void MainWindow::mouseMove(QMouseEvent *event)
{
    // 如果事件是鼠标左键拖动
    if (event->buttons() == Qt::LeftButton)
    {
        // 计算当前缩放因子
        double zoomFactor = 1.0 + (event->pos().y() - event->lastPos().y()) / 100.0;
        // 计算当前的y坐标轴范围
        QCPRange newRange(yMin*zoomFactor, ui->customPlot->yAxis->range().upper*zoomFactor);
        // 将新的范围设置给y坐标轴
        ui->customPlot->yAxis->setRange(newRange);
        ui->customPlot->replot();
    }
}