QChart添加跟随鼠标的十字线_x县豆瓣酱的博客-CSDN博客_qchart鼠标跟踪线
最近在做这么一个东西,需要十字线。我参考自上面的博主的内容,但是他没写全。很多人不知道这个QGraphicsLineItem 是怎么创建的,然后x_line 和y_line 是如何弄到chartview 的Scene中的。
下面试我的效果,实现了:十字线随动,和放大缩小,平移拖动(鼠标中键-滚轮)。
缩放,平移拖动,参考了别的博主的代码。
这是我的效果。下面跟着代码。
qmychartview.h文章来源:https://www.toymoban.com/news/detail-520358.html
#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模板网!