国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QT QChartView 鼠標隨動 十字線 縮放 平移 拖動

這篇具有很好參考價值的文章主要介紹了QT QChartView 鼠標隨動 十字線 縮放 平移 拖動。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

QChart添加跟隨鼠標的十字線_x縣豆瓣醬的博客-CSDN博客_qchart鼠標跟蹤線

最近在做這么一個東西,需要十字線。我參考自上面的博主的內(nèi)容,但是他沒寫全。很多人不知道這個QGraphicsLineItem 是怎么創(chuàng)建的,然后x_line 和y_line 是如何弄到chartview 的Scene中的。

下面試我的效果,實現(xiàn)了:十字線隨動,和放大縮小,平移拖動(鼠標中鍵-滾輪)。

縮放,平移拖動,參考了別的博主的代碼。

qchart鼠標跟蹤線,Qt,qt,開發(fā)語言,鼠標隨動

qchart鼠標跟蹤線,Qt,qt,開發(fā)語言,鼠標隨動

這是我的效果。下面跟著代碼。

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文章來源地址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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包