QChart添加跟随鼠标的十字线_x县豆瓣酱的博客-CSDN博客_qchart鼠标跟踪线

最近在做这么一个东西,需要十字线。我参考自上面的博主的内容,但是他没写全。很多人不知道这个QGraphicsLineItem 是怎么创建的,然后x_line 和y_line 是如何弄到chartview 的Scene中的。

下面试我的效果,实现了:十字线随动,和放大缩小,平移拖动(鼠标中键-滚轮)

缩放,平移拖动,参考了别的博主的代码。

这是我的效果。下面跟着代码。

qmychartview.h

#ifndef QMYCHARTVIEW_H
#define QMYCHARTVIEW_H#include <QtCharts/QChartView>
#include <QObject>QT_CHARTS_USE_NAMESPACE
//using namespace QtCharts; // 这句和上面这句等价否则不认识 QChartView
class QMyChartView : public QChartView
{Q_OBJECT
public:QMyChartView(QWidget* pParent = nullptr);virtual ~QMyChartView();
protected:virtual void mouseMoveEvent(QMouseEvent *pEvent) override;virtual void mousePressEvent(QMouseEvent *pEvent) override;virtual void mouseReleaseEvent(QMouseEvent *pEvent) override;virtual void wheelEvent(QWheelEvent *pEvent) override;virtual void enterEvent(QEvent *pEvent)override;virtual void leaveEvent(QEvent *pEvent)override;
private:bool m_bMiddleButtonPressed;QPoint m_oPrePos;QGraphicsLineItem* x_line;QGraphicsLineItem* y_line;int m_oldPosOfX = 0;
signals:void sendXpos(int nPos);};#endif // QMYCHARTVIEW_H

qmychartview.cpp

#include "qmychartview.h"
#include <QDebug>
QMyChartView::QMyChartView(QWidget* pParent /*= nullptr*/):QChartView(pParent),m_bMiddleButtonPressed(false) ,m_oPrePos(0, 0)
{// 创建线x_line = new QGraphicsLineItem();// 设置颜色x_line->setPen(QPen(QColor( 100, 100, 100 )));x_line->setZValue(2);y_line = new QGraphicsLineItem();y_line->setPen(QPen(QColor( 100, 100, 100 )));y_line->setZValue(2);// 添加到scene中。this->scene()->addItem(x_line);this->scene()->addItem(y_line);}
QMyChartView::~QMyChartView()
{}
// 鼠标移动
void QMyChartView::mouseMoveEvent(QMouseEvent *pEvent)
{if (m_bMiddleButtonPressed){QPoint oDeltaPos = pEvent->pos() - m_oPrePos;this->chart()->scroll(-oDeltaPos.x(), oDeltaPos.y());m_oPrePos = pEvent->pos();}//qDebug()<< this->chart()->mapToValue(pEvent->pos()).x();//把鼠标坐标值转化为画出的图中的坐标//qDebug() << "the x is :" << pEvent->pos().x() << " inchart :" << this->chart()->mapToValue(pEvent->pos());__super::mouseMoveEvent(pEvent);// 绘制线x_line->setLine(pEvent->x(),0,pEvent->x(),this->height());y_line->setLine(0,pEvent->y(),this->width(),pEvent->y());// 把x坐标发出去int nX = this->chart()->mapToValue(pEvent->pos()).x();if(nX != m_oldPosOfX){m_oldPosOfX = nX;emit sendXpos(m_oldPosOfX);}
}// 鼠标按键
void QMyChartView::mousePressEvent(QMouseEvent *pEvent)
{if (pEvent->button() == Qt::MiddleButton){m_bMiddleButtonPressed = true;m_oPrePos = pEvent->pos();this->setCursor(Qt::OpenHandCursor);}__super::mousePressEvent(pEvent);
}
// 鼠标抬起
void QMyChartView::mouseReleaseEvent(QMouseEvent *pEvent)
{if (pEvent->button() == Qt::MiddleButton){m_bMiddleButtonPressed = false;this->setCursor(Qt::ArrowCursor);}__super::mouseReleaseEvent(pEvent);
}void QMyChartView::wheelEvent(QWheelEvent *pEvent)
{qreal rVal = std::pow(0.999, pEvent->delta()); // 设置比例// 1. 读取视图基本信息QRectF oPlotAreaRect = this->chart()->plotArea();QPointF oCenterPoint = oPlotAreaRect.center();// 2. 水平调整oPlotAreaRect.setWidth(oPlotAreaRect.width() * rVal);// 3. 竖直调整oPlotAreaRect.setHeight(oPlotAreaRect.height() * rVal);// 4.1 计算视点,视点不变,围绕中心缩放//QPointF oNewCenterPoint(oCenterPoint);// 4.2 计算视点,让鼠标点击的位置移动到窗口中心//QPointF oNewCenterPoint(pEvent->pos());// 4.3 计算视点,让鼠标点击的位置尽量保持不动(等比换算,存在一点误差)QPointF oNewCenterPoint(2 * oCenterPoint - pEvent->pos() - (oCenterPoint - pEvent->pos()) / rVal);// 5. 设置视点oPlotAreaRect.moveCenter(oNewCenterPoint);// 6. 提交缩放调整this->chart()->zoomIn(oPlotAreaRect);__super::wheelEvent(pEvent);
}void QMyChartView::enterEvent(QEvent *pEvent)
{x_line->setVisible(true);y_line->setVisible(true);__super::enterEvent(pEvent);
}void QMyChartView::leaveEvent(QEvent *pEvent)
{x_line->setVisible(false);y_line->setVisible(false);__super::leaveEvent(pEvent);
}

QT QChartView 鼠标随动 十字线 缩放 平移 拖动相关推荐

  1. Qt for python QChartView鼠标滚动放大缩小

    文章目录 前言 基于 QChart 缩放的几种方式 使用QChartView来缩放 使用QChart来平移和缩放 使用QValueAxis或者QDateTimeAxis来平移和缩放 Qt曲线图表模块Q ...

  2. halcon窗体的移动和缩放_Halcon hWindowControl 鼠标缩放平移区域模板匹配绘制

    如题所示标题,想同时表达两个意思:1:缩放平移绘制区域,2:创建模板匹配区域并保存.被一个技术问题卡住折腾了近大半天时间+熬夜2个小时,经过不懈努力,反复验证各参数意义,找到了问题的原因,终于攻克难题 ...

  3. Unity3D使用鼠标旋转缩放平移视角

    Unity使用鼠标旋转缩放平移视角 用代码在Game界面完美实现Scene界面的操作方法. 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上. 视角跟踪的是一个空物体,当然如果你是做RPG游 ...

  4. 【QT 5 设置自定义标题栏+学习:《QT实现鼠标拖动调整窗口大小》+基础样例】

    [QT 5 设置自定义标题栏+学习:<QT实现鼠标拖动调整窗口大小>+基础样例] 1.说明 2.实验环境 3.实验目的 4.参考文章 5.实验步骤 (1)下载代码,运行没有错误. (2)加 ...

  5. 软件项目技术点(1)——d3.interpolateZoom-在两个点之间平滑地缩放平移

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 软件参考d3的知识点 我们在软件中主要用到d3.js的核心函数d3.interpolateZoom - 在两个点之间平滑地缩放平移.请 ...

  6. android 绘画开源,Android 开源可缩放平移的绘画板

    ScaleSketchPadDemo 此项目包含两个模块 app1 为普通绘画板 app2 为可所发的绘画板 方便各位Android 开发者理解和使用 用法: clone or download 项目 ...

  7. 再谈winform无边框窗体的鼠标托动与缩放

    在winform经常用到无边框的窗体,原因就是想使自己的程序界面完全的自定义,网上也有过不少的相关资料 今天我发了一下的午的时间整理了一下.觉得还不错,贴出来看看. 为了提高托动的缩放的效率,减少系统 ...

  8. QT中鼠标位置获取问题之event-globalPos()与pos()函数

    QT中鼠标位置获取问题之event->globalPos()与pos()函数 标签: Qt 2015-01-03 19:41 820人阅读 评论(0) 收藏 举报 分类: Qt 版权声明:本文为 ...

  9. qt linux实现鼠标位置自动移动,【已解决】qt中鼠标能显示但是无法移动

    [问题] 在完成了Linux kernel中的对应的一个模拟鼠标的输入设备(input device)easypoint驱动后,验证了该驱动可以正常工作了,输入 cat /dev/input/even ...

最新文章

  1. 为什么RStudio Server这么慢?
  2. python中为什么训练数据_python训练数据时打乱训练数据与标签
  3. sql注入攻击与防御第二版读书笔记二——SQL盲注利用
  4. 什么是GDT,LDT,GDTR及LDTR?
  5. jdbc增删改查有哪些步骤_用Mybatis如何实现对数据库的增删改查步骤
  6. UVA - 11694 Gokigen Naname(dfs)
  7. php2个数字拼接,PHP合并2个数字键数组值示例详解
  8. dos命令窗口光标闪烁_史上最全的Vim命令(二)
  9. struts2第一个程序 Helloworld
  10. 手把手教你使用XUI的正确姿势
  11. 高德地图获取经纬度工具类
  12. java编程基础总结——20.foreach遍历及lambda表达式
  13. linux teamviewer,Linux 系统下安装 teamviewer
  14. 十大经典排序算法--详解
  15. 微信开发——加密认证
  16. html鼠标键弹起事件,js鼠标按键事件和键盘按键事件用法实例汇总
  17. 糅合flutter-boost与MethodChannel的使用方法
  18. Java猜数字大小游戏
  19. CT一般扫描参数_CT胶片上那些与剂量相关的参数!
  20. keil中创建lib库,使用lib库

热门文章

  1. 理解:虚拟内存,虚拟内存地址,物理内存,物理内存地址
  2. cad缩小_CAD图纸输出或打印后的尺寸为什么比实际小几毫米?【AutoCAD教程】
  3. 官宣!香港大学,将落户深圳
  4. 只有300万预算,能在深圳买到什么样的二手房?分析20778套二手房
  5. 计算机病毒手动查杀,手动查杀电脑病毒的一些基本方法
  6. 【Cocos2d-X开发学习笔记】第15期:动作类之摄像机动作和基本样条动作的使用
  7. Java中Thread类的start()和run()方法
  8. vue官网学习笔记(九)组件基础
  9. SMETA验厂咨询,SMETA参考实践指南BPG(本文件)的制作旨在提供一份一致的全球审核程序
  10. [svn]log命令