QChart添加跟隨鼠標的十字線_x縣豆瓣醬的博客-CSDN博客_qchart鼠標跟蹤線
最近在做這么一個東西,需要十字線。我參考自上面的博主的內(nèi)容,但是他沒寫全。很多人不知道這個QGraphicsLineItem 是怎么創(chuàng)建的,然后x_line 和y_line 是如何弄到chartview 的Scene中的。
下面試我的效果,實現(xiàn)了:十字線隨動,和放大縮小,平移拖動(鼠標中鍵-滾輪)。
縮放,平移拖動,參考了別的博主的代碼。
這是我的效果。下面跟著代碼。
qmychartview.h文章來源:http://www.zghlxwxcb.cn/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文章來源地址http://www.zghlxwxcb.cn/news/detail-520358.html
#include "qmychartview.h"
#include <QDebug>
QMyChartView::QMyChartView(QWidget* pParent /*= nullptr*/):
QChartView(pParent),
m_bMiddleButtonPressed(false) ,
m_oPrePos(0, 0)
{
// 創(chuàng)建線
x_line = new QGraphicsLineItem();
// 設(shè)置顏色
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();//把鼠標坐標值轉(zhuǎn)化為畫出的圖中的坐標
//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坐標發(fā)出去
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()); // 設(shè)置比例
// 1. 讀取視圖基本信息
QRectF oPlotAreaRect = this->chart()->plotArea();
QPointF oCenterPoint = oPlotAreaRect.center();
// 2. 水平調(diào)整
oPlotAreaRect.setWidth(oPlotAreaRect.width() * rVal);
// 3. 豎直調(diào)整
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. 設(shè)置視點
oPlotAreaRect.moveCenter(oNewCenterPoint);
// 6. 提交縮放調(diào)整
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);
}
到了這里,關(guān)于QT QChartView 鼠標隨動 十字線 縮放 平移 拖動的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!