QCustomPlot实现曲线拖拽

这篇具有很好参考价值的文章主要介绍了QCustomPlot实现曲线拖拽。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求场景:

曲线图应该同时具有以下功能点:
1、在画布上进行鼠标框选,实现坐标缩放。
2、可以上下拖动某曲线。

QCustomPlot实现曲线拖拽,qt,qcustomplot,c++

一、选择控件

这里选择QCustomPlot,是一个C++绘图库,可以创建各种类型的绘图,包括散点图、曲线图、直方图、颜色地图、轮廓图等,可以跨平台使用。

以下是QCustomPlot的官方文档:
QCustomPlot官方网站
https://www.qcustomplot.com/

二、将QCustomPlot库整合到你的Qt项目中

1、下载源代码

QCustomPlot实现曲线拖拽,qt,qcustomplot,c++

2、创建.pri

.pri文件的内容添加如下:

HEADERS += \
    $$PWD/qcustomplot.h

SOURCES += \
    $$PWD/qcustomplot.cpp

将.pri文件,.cpp文件,.h文件放到同一个文件夹下,示例项目为PlotTest。:
QCustomPlot实现曲线拖拽,qt,qcustomplot,c++
并在项目配置文件.pro文件中添加语句:

include(CustomPlot/CustomPlot.pri)

重新构建后,可以看到qcustomplot库已经整合到项目中:
QCustomPlot实现曲线拖拽,qt,qcustomplot,c++

三、鼠标框选,实现坐标缩放

实现代码:

mCustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
mCustomPlot->setSelectionRectMode(QCP::SelectionRectMode::srmZoom);

说明:

mCustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);

setInteractions 函数配置图表的交互方式:

QCP::iRangeDrag:启用拖动操作,允许在图表上拖动以平移视图(画布的拖动而非拖动曲线)。
QCP::iRangeZoom:启用缩放操作,允许在图表上进行鼠标滚轮缩放或选择区域以进行缩放。
QCP::iSelectPlottables:启用可选择图表元素的操作。这允许你在图表上单击选择图形元素,以便进行进一步的操作或分析。

前两个选项用于框选,后一个选项支持曲线拖动。
mCustomPlot->setSelectionRectMode(QCP::SelectionRectMode::srmZoom);

setSelectionRectMode 函数配置选择矩形的工作模式:

QCP::srmNone:禁用选择矩形,用户无法使用选择矩形进行任何操作。
QCP::srmZoom:启用选择矩形以进行缩放操作,用户可以在图表上创建选择矩形以放大或缩小选定区域。
QCP::srmSelect:启用选择矩形以选择图表中的对象,用户可以在图表上创建选择矩形以选择图表元素,例如曲线。
QCP::srmCustom:自定义选择矩形操作模式,可以根据需要自定义操作。

这里的矩形指的是框选矩形,如下所示:
QCustomPlot实现曲线拖拽,qt,qcustomplot,c++

四、曲线拖动

要实现曲线拖动的思路是,首先要定位,知道拖动的是哪条曲线,其次是当鼠标移动时,要根据鼠标坐标改变曲线。

1、定位曲线

通过信号selectionChangedByUser获得曲线index。

connect(mCustomPlot, &QCustomPlot::selectionChangedByUser, this, &ResultCurves::getSelection);

在getSelection槽函数中,可以进行处理,可以用成员变量存储当前用户选中的曲线index
2、移动时改变曲线

重写鼠标移动事件mouseMoveEvent。

void ResultCurves::mouseMoveEvent(QMouseEvent *event)
{
	//获取鼠标的本地窗口坐标
    double x = event->pos().x();
    double y = event->pos().y();
	//将鼠标指针的像素坐标转换为图表上的实际坐标
    double xCurve = mCustomPlot->xAxis->pixelToCoord(x);
    double yCurve = mCustomPlot->yAxis->pixelToCoord(y);
	//获取当前图表显示的y轴最大坐标,这里用于限制曲线的移动坐标范围
    double yMax = mCustomPlot->yAxis->range().upper;
    double yMin = mCustomPlot->yAxis->range().lower;

    mPosX = xCurve;
    mPosY = yCurve;

    if(mPosY > yMax){
        mPosY = yMax;
    }

    if(mPosY < yMin){
        mPosY = yMin;
    }
	//当目标曲线被选中时,在drawThresholdLine中进行曲线的重新绘制
    if(mIsThresholdSelected)
    {
        drawThresholdLine(mPosY);
    }
}

void ResultCurves::drawThresholdLine(double yValue)
{
	//在QCustomPlot对象和mGraphList曲线列表中删除目标曲线
    mCustomPlot->removeGraph(mGraphList.size() - 1);
    mGraphList.removeLast();
    //新增更新曲线
    QVector<double> temp;
    for(int i=0; i<mCurveList.begin().value().size(); i++)
    {
        temp.append(yValue);
    }

    addCurve(mGraphList.size(),mXValues,temp);
    mCustomPlot->replot();
}

五、问题的产生与解决

可以发现,以上两个功能的触发方式都是鼠标左键单击,经过实践,qcustomplot不能区分鼠标左键单击后是执行框选还是拖动,即使是在mousepressevent中判断是否选中目标曲线,若选中则mCustomPlot->setSelectionRectMode(QCP::SelectionRectMode::srmNone);(禁用矩形),也不能使两个功能共存。

1、查看源码

发现在QCustomPlot::mouseMoveEvent中,调用到一个函数processPointSelection:
QCustomPlot实现曲线拖拽,qt,qcustomplot,c++
该函数处理鼠标事件,特别是点选操作,也仅在QCustomPlot::mouseMoveEvent中调用。如果发生了选择状态的更改(selectionStateChanged 为 true),则发出 selectionChangedByUser 信号。
所以一个简单直接的思路是,当我想框选时,不调用该函数,不进行点选操作;当我想拖动时,调用该函数,发出 selectionChangedByUser 信号。
因此增加一个bool变量和接口:QCustomPlot实现曲线拖拽,qt,qcustomplot,c++
QCustomPlot实现曲线拖拽,qt,qcustomplot,c++

2、修改本项目代码

在以上更改后,在我们自定义类的mousePressEvent中,当选中曲线index为目标曲线index时:

mCustomPlot->setSelectionRectMode(QCP::SelectionRectMode::srmNone);
mCustomPlot->setHoverPicked(false);

而在mouseReleaseEvent中:

mCustomPlot->setSelectionRectMode(QCP::SelectionRectMode::srmZoom);

从而最终可以满足文章开头的需求任务。

欢迎一起讨论!文章来源地址https://www.toymoban.com/news/detail-724510.html

到了这里,关于QCustomPlot实现曲线拖拽的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT】QCustomPlot开发笔记

    01、QCustomPlot简介 QCustomPlot 是一个用于科学绘图的 QT 第三方库,可以用于常见的二维图像绘制,比如函数曲线、参数方程曲线、热力图、柱状图、箱线图、极坐标绘图等。该库由德国人 Emanuel Eichhammer 开发,经历了多次版本迭代,支持跨平台,开源遵循 GNU GPL 协议,也可以联

    2024年02月12日
    浏览(38)
  • Qt QCustomPlot 绘制子轴

    抄大神杰作: QCustomplot(五)QCPAxisRect进行子绘图-CSDN博客 文章浏览阅读5.9k次,点赞7次,收藏60次。文中介绍了QCustomPlot 子绘图需要掌握的类,也就是Matlab中的subplot,最后给出了一个完整的例子。_qcpaxisrect https://blog.csdn.net/weixin_39258979/article/details/122008568 需求来源:试验数据

    2024年01月20日
    浏览(34)
  • Qt实时波形绘图(使用QCustomPlot)

    目录 前言 一、Qt是什么? 二、QCustomPlot是什么? 三、Qt实时波形绘图         3.1 开发环境和工具         3.2 实时波形绘图控件 3.2.1 界面设计及功能 3.2.2 如何使用该控件 总结         我们在涉及或调试设备时,通常需要查看过程数据,以便了解设备的运行情况

    2024年02月08日
    浏览(38)
  • Qt开发1--QCustomPlot的第一个示例

    本文记录了在Linux上使用QCustomPlot进行一个基本绘制所需的完整过程,包括如何使用qtcreator,编辑ui以及编写相应的C++代码。以下是详细步骤: 1、使用qtcreator启动开发环境: 启动后,显示以下一个操作界面:  2、通过菜单栏File-New File or Project启动项目新建向导: 3、选择App

    2024年02月11日
    浏览(42)
  • Qt应用开发(拓展篇)——示波器/图表 QCustomPlot

             QCustomPlot 是一个用于绘图和数据可视化的Qt C++小部件。它没有进一步的依赖关系,提供友好的文档帮助。这个绘图库专注于制作好看的,出版质量的2D绘图,图形和图表,以及为实时可视化应用程序提供高性能。         QCustomPlot可以导出各种格式,如矢量化

    2024年02月11日
    浏览(39)
  • 【Qt】QCustomPlot组件跟随鼠标显示xy轴坐标位置

    目录 一、 问题描述 二、 解决方案 三、代码实现 一、 问题描述 如题所述。 二、 解决方案 自定义一个继承QCustomPlot类的实现类,重写mouseMove虚函数实现,从而获取鼠标位置,然后计算出点的坐标值,再利用QToolTip显示点坐标。 三、代码实现 继承自QCustomPlot组件的MFMCustomPl

    2024年02月11日
    浏览(49)
  • qt使用QCustomplot绘制cpu和内存使用率图

                QCustomPlot是一个开源的Qt C++图表库,用于可视化数据。该库提供了多种类型的可定制的图表,包括散点图、线图、柱状图和等高线图等。它还支持自定义绘制,可以创建任意形状和大小的元素,并使其与其他元素交互。QCustomPlot易于集成到现有的Qt应用程序中

    2024年02月09日
    浏览(52)
  • VS2022+qt5.14.2配置qcustomplot2.1.16(坑很多)

    QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用。 官方网址:https://www.qcustomplot.com/ 源码下载地址:https://www.qcustomplot.com/index.php/download 将qcustomplot.h和qcustomplot.cpp2个文件添加到QT项目,如下: 在项目属性Qt

    2024年02月13日
    浏览(51)
  • QCustomplot笔记(二)之QCustomplot 坐标轴属性设置

    一.前言 记录分享楼主学习QCustomplot的过程,楼主最近查看了坐标轴的一些属性设置,于是便记录下 属性设置不一定全,也不一定都对,不喜勿喷 二.坐标轴属性类别 1.设置坐标是否显示 2.手动设置坐标轴的范围 3.设置坐标轴线条属性 4.设置坐标系背景属性,QCustomplot提供了设

    2024年02月11日
    浏览(40)
  • QCustomPlot 绘制卡顿问题

    大数据量导致曲线绘制卡顿问题 这里提供一个思路在跟踪源码中发现底层卡顿在vector的resize() 此处扩容中 所以尽量使用下面的接口 而不是使用addData这个接口,还有setData这个接口

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包