QChart添加跟随鼠标的十字线_x县豆瓣酱的博客-CSDN博客_qchart鼠标跟踪线
最近在做这么一个东西,需要十字线。我参考自上面的博主的内容,但是他没写全。很多人不知道这个QGraphicsLineItem 是怎么创建的,然后x_line 和y_line 是如何弄到chartview 的Scene中的。
下面试我的效果,实现了:十字线随动,和放大缩小,平移拖动(鼠标中键-滚轮)。
缩放,平移拖动,参考了别的博主的代码。


这是我的效果。下面跟着代码。
qmychartview.h
- #ifndef QMYCHARTVIEW_H
- #define QMYCHARTVIEW_H
-
- #include
- #include
-
- 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
- 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);
- }