Qt QML中chartview使用鼠标动态跟随数值(AreaSeries十字交叉定位)

46 篇文章 22 订阅

先看效果图:

之前写过关于在LineSeries中实现十字交叉定位数据,上一篇:鼠标动态跟随数值LineSeries(十字交叉定位),该方法需要鼠标放置在图表折线上时由Hovered信号返回位置点数据。但如果是AreaSeries时,使用该方法返回的则是面积图内部点的位置,无法实现上图中的效果,因此使用MouseArea实现,思路为:

1、MouseArea获取鼠标位置(X1,Y1),此时的Y1值不是面积图包络的位置;

2、先使用mapToValue获得该鼠标位置处AreaSeries横坐标的值;

3、由该横坐标值获得面积图包络线LineSeries对应点的值

4、将该值通过mapToPosition获得该值对应点位置(X2,Y2)

5、以(X1,Y2)为十字中心点绘制两条相互垂直的直线

 QML:

    ChartView{
        id:heightChartView
        anchors.fill: parent
        
        ValueAxis {
            id: valueAxis
            min: 0
            max: 15
            tickCount: 15
            labelFormat: "%.0f"
        }
        
        AreaSeries {//面积图Series
            id:heightAreaSeries
            name:"test"
            axisX: valueAxis
            upperSeries: LineSeries{//面积图包络Series
                id:heightLineSeries
                XYPoint { x: 0; y: 100 }
                XYPoint { x: 1; y: 90 }
                XYPoint { x: 2; y: 70 }
                XYPoint { x: 3; y: 60 }
                XYPoint { x: 4; y: 51 }
                XYPoint { x: 5; y: 60 }
                XYPoint { x: 6; y: 100 }
                XYPoint { x: 7; y: 120 }
                XYPoint { x: 8; y: 110 }
                XYPoint { x: 9; y: 80 }
                XYPoint { x: 10; y: 140 }
                XYPoint { x: 11; y: 60 }
                XYPoint { x: 12; y: 110 }
                XYPoint { x: 13; y: 70 }
                XYPoint { x: 14; y: 40 }
                XYPoint { x: 15; y: 80 }
            }
        }
        
        MouseArea{
            anchors.fill: heightChartView
            hoverEnabled: true
            onPositionChanged: {//获取鼠标移动时的相对位置
                var areaPoint = heightChartView.mapToValue(Qt.point(mouse.x,mouse.y),heightAreaSeries)//使用mapToValue获得该鼠标位置处AreaSeries横坐标的值
                var value = heightLineSeries.at(areaPoint.x)//由该横坐标值获得面积图包络线LineSeries对应点的值
                var chartPosition = heightChartView.mapToPosition(value,heightAreaSeries)//将该值通过mapToPosition获得该值对应点位置(X2,Y2)
                myCanvas.xx = mouse.x
                myCanvas.yy = chartPosition.y
                myCanvas.requestPaint()
                
            }
            onExited:{//检测鼠标是否离开图表区域
                myCanvas.xx = 0
                myCanvas.yy = 0
                myCanvas.requestPaint()
            }
        }
        
        Canvas{
            id:myCanvas
            anchors.fill: heightChartView
            property double xx: 0
            property double yy: 0
            onPaint: {
                if(xx+yy>0){
                    var ctx = getContext("2d")//绘制十字交叉的竖线
                    ctx.clearRect(0,0,parent.width,parent.height)
                    ctx.strokeStyle = '#ccf48993'
                    ctx.lineWidth = 3
                    ctx.beginPath()
                    ctx.moveTo(xx,heightChartView.plotArea.y)
                    ctx.lineTo(xx,heightChartView.plotArea.height+heightChartView.plotArea.y)
                    ctx.stroke()
                    ctx.beginPath()//绘制十字交叉的横线
                    ctx.moveTo(heightChartView.plotArea.x,yy)
                    ctx.lineTo(heightChartView.plotArea.x+heightChartView.plotArea.width,yy)
                    ctx.stroke()
                }else{//鼠标离开图表区域时,清除十字线
                    var ctx = getContext("2d")
                    ctx.clearRect(0,0,parent.width,parent.height)
                }
            }
        }
    }

 

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qt QChart是Qt提供的用于图表绘制的模块之一,通过QChart可以方便地创建各种类型的图表。在QChart,可以通过处理鼠标事件来实现与用户的交互。 QChart鼠标事件主要包括三种:鼠标按下、鼠标移动和鼠标释放。可以通过在QChartView的事件过滤器重写这些事件的处理函数来实现对鼠标事件的响应。 首先,需要在QChartView对象上启用鼠标追踪功能,这样在鼠标移动事件发生时才能捕捉到鼠标的当前位置。可以通过调用setMouseTracking(true)函数来实现。 在鼠标按下事件,可以获取鼠标的当前位置,然后通过调用chart()->mapToValue()函数将屏幕坐标映射为图表坐标,从而确定鼠标点击的位置。接着,可以根据此位置进行相应的处理,例如高亮显示特定数据点或弹出数据提示框等。 在鼠标移动事件,同样可以通过chart()->mapToValue()函数获取鼠标当前位置对应的图表坐标,然后可以根据当前位置的变化来动态更新图表的一些元素,比如显示当前坐标数值等。 在鼠标释放事件,可以进行一些清理工作,例如恢复图表的初始状态,取消数据点的高亮显示等。 总的来说,通过处理QChartView鼠标事件,可以实现对QChart图表的交互操作,为用户提供更加丰富的数据展示和操作方式。 ### 回答2: Qt QChart是Qt框架的一个图表库,用于绘制各种类型的图表。在QChart,可以通过鼠标事件来与图表进行交互和操作。 首先,在QChart,可以通过重写QWidget的鼠标事件相关的函数来处理鼠标事件。常用的鼠标事件函数有鼠标按下事件(mousePressEvent)、鼠标移动事件(mouseMoveEvent)、鼠标释放事件(mouseReleaseEvent)等。 鼠标按下事件(mousePressEvent)在用户按下鼠标按钮时触发,并通过获取鼠标坐标等信息来响应用户的操作。在QChart,可以通过获取鼠标坐标,并利用坐标信息实现一些与鼠标操作相关的功能,例如在图表上显示数据点的数值鼠标移动事件(mouseMoveEvent)在用户移动鼠标时触发,可以通过获取鼠标坐标等信息进行一些动态效果的实现。例如,在移动鼠标时,在图表上显示鼠标所在位置的数据点信息。 鼠标释放事件(mouseReleaseEvent)在用户释放鼠标按钮时触发,可以用于完成一些鼠标操作的结束动作。例如,绘制一个矩形框选取图表上的一部分数据点。 通过使用这些鼠标事件函数,可以实现一些与用户交互和操作相关的功能。例如,通过判断鼠标的点击位置,在图表上绘制一个十字线,用于显示当前鼠标所在位置的数据点;或者通过鼠标拖拽某个数据点,实现数据的动态更新和交互。 总之,Qt QChart提供了丰富的鼠标事件函数,可以通过重写这些函数来响应用户的鼠标操作,实现与图表相关的交互和操作功能。 ### 回答3: Qt QChart提供了一些鼠标事件来处理用户与图表的交互。以下是一些常见的鼠标事件及其作用: 1. 鼠标进入事件(QEvent::Enter):当鼠标进入图表区域时触发,可以用于显示鼠标所在位置的数值或增加交互效果。 2. 鼠标移动事件(QEvent::MouseMove):当鼠标在图表区域内移动时触发,可以使用cursor().pos()函数获取当前鼠标的位置,以便在相应的坐标轴上显示数值或进行其他操作。 3. 鼠标滚轮事件(QEvent::Wheel):当鼠标滚轮在图表区域内滚动时触发,可以使用event->delta()函数获取滚轮的滚动方向和滚动距离,再根据需要进行图表的缩放或滚动。 4. 鼠标按下事件(QEvent::MouseButtonPress):当鼠标按下时触发,可以使用event->button()函数获取按下的鼠标按钮的类型(左键、右键、键等),再根据需要进行相应的操作,比如拖拽图表。 5. 鼠标释放事件(QEvent::MouseButtonRelease):当鼠标释放时触发,一般与鼠标按下事件结合使用,用于完成一些与鼠标操作相关的任务。 通过对这些鼠标事件的处理,可以实现一些高级的交互功能,如放大缩小、平移、数据查询等,从而提升用户体验和操作的灵活性。因此,在使用Qt QChart绘制图表时,合理处理这些鼠标事件是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵叫的猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值