• QT QChartView 鼠标随动 十字线


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

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

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

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

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

    qmychartview.h

    1. #ifndef QMYCHARTVIEW_H
    2. #define QMYCHARTVIEW_H
    3. #include
    4. #include
    5. QT_CHARTS_USE_NAMESPACE
    6. //using namespace QtCharts; // 这句和上面这句等价否则不认识 QChartView
    7. class QMyChartView : public QChartView
    8. {
    9. Q_OBJECT
    10. public:
    11. QMyChartView(QWidget* pParent = nullptr);
    12. virtual ~QMyChartView();
    13. protected:
    14. virtual void mouseMoveEvent(QMouseEvent *pEvent) override;
    15. virtual void mousePressEvent(QMouseEvent *pEvent) override;
    16. virtual void mouseReleaseEvent(QMouseEvent *pEvent) override;
    17. virtual void wheelEvent(QWheelEvent *pEvent) override;
    18. virtual void enterEvent(QEvent *pEvent)override;
    19. virtual void leaveEvent(QEvent *pEvent)override;
    20. private:
    21. bool m_bMiddleButtonPressed;
    22. QPoint m_oPrePos;
    23. QGraphicsLineItem* x_line;
    24. QGraphicsLineItem* y_line;
    25. int m_oldPosOfX = 0;
    26. signals:
    27. void sendXpos(int nPos);
    28. };
    29. #endif // QMYCHARTVIEW_H

     qmychartview.cpp

    1. #include "qmychartview.h"
    2. #include
    3. QMyChartView::QMyChartView(QWidget* pParent /*= nullptr*/):
    4. QChartView(pParent),
    5. m_bMiddleButtonPressed(false) ,
    6. m_oPrePos(0, 0)
    7. {
    8. // 创建线
    9. x_line = new QGraphicsLineItem();
    10. // 设置颜色
    11. x_line->setPen(QPen(QColor( 100, 100, 100 )));
    12. x_line->setZValue(2);
    13. y_line = new QGraphicsLineItem();
    14. y_line->setPen(QPen(QColor( 100, 100, 100 )));
    15. y_line->setZValue(2);
    16. // 添加到scene中。
    17. this->scene()->addItem(x_line);
    18. this->scene()->addItem(y_line);
    19. }
    20. QMyChartView::~QMyChartView()
    21. {
    22. }
    23. // 鼠标移动
    24. void QMyChartView::mouseMoveEvent(QMouseEvent *pEvent)
    25. {
    26. if (m_bMiddleButtonPressed)
    27. {
    28. QPoint oDeltaPos = pEvent->pos() - m_oPrePos;
    29. this->chart()->scroll(-oDeltaPos.x(), oDeltaPos.y());
    30. m_oPrePos = pEvent->pos();
    31. }
    32. //qDebug()<< this->chart()->mapToValue(pEvent->pos()).x();//把鼠标坐标值转化为画出的图中的坐标
    33. //qDebug() << "the x is :" << pEvent->pos().x() << " inchart :" << this->chart()->mapToValue(pEvent->pos());
    34. __super::mouseMoveEvent(pEvent);
    35. // 绘制线
    36. x_line->setLine(pEvent->x(),0,pEvent->x(),this->height());
    37. y_line->setLine(0,pEvent->y(),this->width(),pEvent->y());
    38. // 把x坐标发出去
    39. int nX = this->chart()->mapToValue(pEvent->pos()).x();
    40. if(nX != m_oldPosOfX){
    41. m_oldPosOfX = nX;
    42. emit sendXpos(m_oldPosOfX);
    43. }
    44. }
    45. // 鼠标按键
    46. void QMyChartView::mousePressEvent(QMouseEvent *pEvent)
    47. {
    48. if (pEvent->button() == Qt::MiddleButton)
    49. {
    50. m_bMiddleButtonPressed = true;
    51. m_oPrePos = pEvent->pos();
    52. this->setCursor(Qt::OpenHandCursor);
    53. }
    54. __super::mousePressEvent(pEvent);
    55. }
    56. // 鼠标抬起
    57. void QMyChartView::mouseReleaseEvent(QMouseEvent *pEvent)
    58. {
    59. if (pEvent->button() == Qt::MiddleButton)
    60. {
    61. m_bMiddleButtonPressed = false;
    62. this->setCursor(Qt::ArrowCursor);
    63. }
    64. __super::mouseReleaseEvent(pEvent);
    65. }
    66. void QMyChartView::wheelEvent(QWheelEvent *pEvent)
    67. {
    68. qreal rVal = std::pow(0.999, pEvent->delta()); // 设置比例
    69. // 1. 读取视图基本信息
    70. QRectF oPlotAreaRect = this->chart()->plotArea();
    71. QPointF oCenterPoint = oPlotAreaRect.center();
    72. // 2. 水平调整
    73. oPlotAreaRect.setWidth(oPlotAreaRect.width() * rVal);
    74. // 3. 竖直调整
    75. oPlotAreaRect.setHeight(oPlotAreaRect.height() * rVal);
    76. // 4.1 计算视点,视点不变,围绕中心缩放
    77. //QPointF oNewCenterPoint(oCenterPoint);
    78. // 4.2 计算视点,让鼠标点击的位置移动到窗口中心
    79. //QPointF oNewCenterPoint(pEvent->pos());
    80. // 4.3 计算视点,让鼠标点击的位置尽量保持不动(等比换算,存在一点误差)
    81. QPointF oNewCenterPoint(2 * oCenterPoint - pEvent->pos() - (oCenterPoint - pEvent->pos()) / rVal);
    82. // 5. 设置视点
    83. oPlotAreaRect.moveCenter(oNewCenterPoint);
    84. // 6. 提交缩放调整
    85. this->chart()->zoomIn(oPlotAreaRect);
    86. __super::wheelEvent(pEvent);
    87. }
    88. void QMyChartView::enterEvent(QEvent *pEvent)
    89. {
    90. x_line->setVisible(true);
    91. y_line->setVisible(true);
    92. __super::enterEvent(pEvent);
    93. }
    94. void QMyChartView::leaveEvent(QEvent *pEvent)
    95. {
    96. x_line->setVisible(false);
    97. y_line->setVisible(false);
    98. __super::leaveEvent(pEvent);
    99. }

  • 相关阅读:
    UniVue更新日志:使用ObservableList优化LoopList/LoopGrid组件的使用
    KMP算法的一些注意事项
    STC89C51基础及项目第15天:小车测速、添加语言识别控制
    LED驱动IC:HC2160,内置60V功率MOS升压型LED恒流驱动IC。供应LED灯杯单节电池以上供电的LED灯串平板显示LED背光大功率LED照明
    STL应用 —— deque
    [CTF] 2018-百越杯-Misc-血小板天下第一可爱
    【macOS】Win通过VNC远程控制Macbook
    前端部署自动化 - CI/CD
    ARM汇编之乘法指令
    【集训DAY N】number【数位DP】【状态压缩】
  • 原文地址:https://blog.csdn.net/ILOVEYOULEEHUIJIE/article/details/126785814