QT QChartView 鼠标随动 十字线 缩放 平移 拖动

这篇具有很好参考价值的文章主要介绍了QT QChartView 鼠标随动 十字线 缩放 平移 拖动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

qchart鼠标跟踪线,Qt,qt,开发语言,鼠标随动

qchart鼠标跟踪线,Qt,qt,开发语言,鼠标随动

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

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文章来源地址https://www.toymoban.com/news/detail-520358.html

#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 鼠标随动 十字线 缩放 平移 拖动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包