您好,登錄后才能下訂單哦!
(1)用鼠標框選一個矩形,把圖放大到這個矩形
QChartView::setRubberBand(QChartView::RectangleRubberBand);//XY方向同時放大到鼠標畫出的矩形大小(也可以設置為只放大X軸或Y軸)
(2)setRubberBand函數同時也能使鼠標右鍵,具備縮小圖的功能。
QChart::scroll(-10, 5);//整體平移(-10, 5),兩個參數分別為Δx和Δy
QChart::zoomIn(x,y,width,height);//縮放到指定的矩形
QChart::zoom(0.9) //整體縮放,參數為放縮系數,<1代表縮小,>1代表放大
QChart::zoomReset() //把所有做過的zoomIn、zoomOut、zoom全部撤銷
原理就是,通過設置X/Y軸的范圍來實現平移和縮放。
例如,當前顯示X的顯示范圍為[20, 50],如果我們把X軸的顯示范圍擴大到[0, 80],這樣做的效果就是顯示的圖形變小了,也就實現了縮放。
例如,當前顯示X的顯示范圍為[0, 30],如果我們把X軸的顯示范圍擴大到[10, 40],這樣做的效果就是顯示的圖形左移了,也就實現了平移。
示例代碼:
QValueAxis *axisX = dynamic_cast<QValueAxis*>(Chart->axisX(pLineSeries));//
qreal cur_x_min = axisX->min();
qreal cur_x_max = axisX->max();
axisX->setRange(cur_x_min + 20, cur_x_max + 20);//圖形向左平移20(為什么+代表左移?仔細想想就明白了)
放縮與平移的示例代碼同理
運行效果如下:
.h文件代碼
#ifndef QTCHARTDEMOZOOM_H_38020FA5_FC74_4395_A807_61BF924D2F06 #define QTCHARTDEMOZOOM_H_38020FA5_FC74_4395_A807_61BF924D2F06 #include <QtCharts/QChartView> using namespace QtCharts; class QtChartDemoZoom : public QChartView { Q_OBJECT public: QtChartDemoZoom(QWidget* pParent = nullptr); ~QtChartDemoZoom(); 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; private: bool m_bMiddleButtonPressed; QPoint m_oPrePos; }; #endif //QTCHARTDEMOZOOM_H_38020FA5_FC74_4395_A807_61BF924D2F06
.cpp文件代碼
#include <QLineSeries> QtChartDemoZoom::QtChartDemoZoom(QWidget* pParent /*= nullptr*/) : QChartView(pParent) , m_bMiddleButtonPressed(false) , m_oPrePos(0, 0) { QLineSeries *pLineServies = new QLineSeries(); for (int i = 0; i < 100; ++i) { pLineServies->append(i, qrand() % 10); } this->chart()->addSeries(pLineServies); this->chart()->createDefaultAxes(); } QtChartDemoZoom::~QtChartDemoZoom() { } void QtChartDemoZoom::mouseMoveEvent(QMouseEvent *pEvent) { if (m_bMiddleButtonPressed) { QPoint oDeltaPos = pEvent->pos() - m_oPrePos; this->chart()->scroll(-oDeltaPos.x(), oDeltaPos.y()); m_oPrePos = pEvent->pos(); } __super::mouseMoveEvent(pEvent); } void QtChartDemoZoom::mousePressEvent(QMouseEvent *pEvent) { if (pEvent->button() == Qt::MiddleButton) { m_bMiddleButtonPressed = true; m_oPrePos = pEvent->pos(); this->setCursor(Qt::OpenHandCursor); } __super::mousePressEvent(pEvent); } void QtChartDemoZoom::mouseReleaseEvent(QMouseEvent *pEvent) { if (pEvent->button() == Qt::MiddleButton) { m_bMiddleButtonPressed = false; this->setCursor(Qt::ArrowCursor); } __super::mouseReleaseEvent(pEvent); } void QtChartDemoZoom::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); }
本文講解了Qt曲線圖表模塊QChart庫縮放/平移詳細方法與實例,更多關于Qt曲線圖表模塊QChart庫的知識請查看下面的相關鏈接
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。