Qt圖形圖像開(kāi)發(fā)曲線圖表模塊QChart庫(kù)縮放/平移詳細(xì)方法與實(shí)例
1、使用QChartView來(lái)縮放
(1)用鼠標(biāo)框選一個(gè)矩形,把圖放大到這個(gè)矩形
QChartView::setRubberBand(QChartView::RectangleRubberBand);//XY方向同時(shí)放大到鼠標(biāo)畫(huà)出的矩形大小(也可以設(shè)置為只放大X軸或Y軸)
(2)setRubberBand函數(shù)同時(shí)也能使鼠標(biāo)右鍵,具備縮小圖的功能。
2、使用Qchart來(lái)平移和縮放
QChart::scroll(-10, 5);//整體平移(-10, 5),兩個(gè)參數(shù)分別為Δx和Δy
QChart::zoomIn(x,y,width,height);//縮放到指定的矩形
QChart::zoom(0.9) //整體縮放,參數(shù)為放縮系數(shù),<1代表縮小,>1代表放大
QChart::zoomReset() //把所有做過(guò)的zoomIn、zoomOut、zoom全部撤銷
3、使用QValueAxis或者QDateTimeAxis來(lái)平移和縮放
原理就是,通過(guò)設(shè)置X/Y軸的范圍來(lái)實(shí)現(xiàn)平移和縮放。
例如,當(dāng)前顯示X的顯示范圍為[20, 50],如果我們把X軸的顯示范圍擴(kuò)大到[0, 80],這樣做的效果就是顯示的圖形變小了,也就實(shí)現(xiàn)了縮放。
例如,當(dāng)前顯示X的顯示范圍為[0, 30],如果我們把X軸的顯示范圍擴(kuò)大到[10, 40],這樣做的效果就是顯示的圖形左移了,也就實(shí)現(xiàn)了平移。
示例代碼:
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(為什么+代表左移?仔細(xì)想想就明白了)
放縮與平移的示例代碼同理
Qt曲線圖表模塊QChart庫(kù)縮放、平移實(shí)例
運(yùn)行效果如下:

.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()); // 設(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 計(jì)算視點(diǎn),視點(diǎn)不變,圍繞中心縮放
//QPointF oNewCenterPoint(oCenterPoint);
// 4.2 計(jì)算視點(diǎn),讓鼠標(biāo)點(diǎn)擊的位置移動(dòng)到窗口中心
//QPointF oNewCenterPoint(pEvent->pos());
// 4.3 計(jì)算視點(diǎn),讓鼠標(biāo)點(diǎn)擊的位置盡量保持不動(dòng)(等比換算,存在一點(diǎn)誤差)
QPointF oNewCenterPoint(2 * oCenterPoint - pEvent->pos() - (oCenterPoint - pEvent->pos()) / rVal);
// 5. 設(shè)置視點(diǎn)
oPlotAreaRect.moveCenter(oNewCenterPoint);
// 6. 提交縮放調(diào)整
this->chart()->zoomIn(oPlotAreaRect);
__super::wheelEvent(pEvent);
}
本文講解了Qt曲線圖表模塊QChart庫(kù)縮放/平移詳細(xì)方法與實(shí)例,更多關(guān)于Qt曲線圖表模塊QChart庫(kù)的知識(shí)請(qǐng)查看下面的相關(guān)鏈接
- 基于PyQt5制作一個(gè)數(shù)據(jù)圖表生成器
- Qt繪制圖表的實(shí)現(xiàn)
- Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法
- Qt圖形圖像開(kāi)發(fā)之曲線圖表模塊QChart庫(kù)一個(gè)chart中顯示兩條曲線詳細(xì)方法與實(shí)例
- Qt圖形圖像開(kāi)發(fā)之曲線圖表模塊QChart庫(kù)坐標(biāo)軸和數(shù)據(jù)不對(duì)應(yīng)、密集的散點(diǎn)圖無(wú)法顯示問(wèn)題解決方法
- Qt圖形圖像開(kāi)發(fā)之曲線圖表模塊QChart庫(kù)讀取/設(shè)置X軸的顯示區(qū)間
- Qt圖形圖像開(kāi)發(fā)曲線圖表模塊QChart庫(kù)基本用法、各個(gè)類之間的關(guān)系說(shuō)明
- Qt圖形圖像開(kāi)發(fā)之曲線圖表庫(kù)QChart編譯安裝詳細(xì)方法與使用實(shí)例
- Qt實(shí)現(xiàn)簡(jiǎn)單折線圖表
相關(guān)文章
C++實(shí)現(xiàn)LeetCode( 69.求平方根)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode( 69.求平方根),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言排序算法之冒泡排序?qū)崿F(xiàn)方法【改進(jìn)版】
這篇文章主要介紹了C語(yǔ)言排序算法之冒泡排序?qū)崿F(xiàn)方法,結(jié)合具體實(shí)例形式分析了C語(yǔ)言實(shí)現(xiàn)的基本冒泡排序?qū)崿F(xiàn)方法及增設(shè)flag標(biāo)志位的改進(jìn)型算法,需要的朋友可以參考下2017-09-09
C++實(shí)現(xiàn)LeetCode(99.復(fù)原二叉搜索樹(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(99.復(fù)原二叉搜索樹(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
使用Qt封裝一個(gè)發(fā)送http請(qǐng)求通用類
這篇文章主要為大家詳細(xì)介紹了如何使用Qt封裝一個(gè)通用類,可以通過(guò)QNetworkRequest和QNetworkReply進(jìn)行http請(qǐng)求,感興趣的可以了解一下2024-12-12
Linux系統(tǒng)中C語(yǔ)言編程創(chuàng)建函數(shù)fork()執(zhí)行解析
最近在看進(jìn)程間的通信,看到了fork()函數(shù),雖然以前用過(guò),這次經(jīng)過(guò)思考加深了理解。現(xiàn)總結(jié)如下2013-04-04
淺談Linux環(huán)境下并發(fā)編程中C語(yǔ)言fork()函數(shù)的使用
fork函數(shù)在Linux中可以創(chuàng)建子進(jìn)程即一個(gè)新的進(jìn)程,這里我們根據(jù)實(shí)例來(lái)淺談Linux環(huán)境下并發(fā)編程中C語(yǔ)言fork()函數(shù)的使用,需要的朋友可以參考下2016-06-06
OpenCV reshape函數(shù)實(shí)現(xiàn)矩陣元素序列化
reshape函數(shù)是OpenCV中一個(gè)很有用的函數(shù),不僅可以改變矩陣的通道數(shù),還可以對(duì)矩陣元素進(jìn)行序列化。本文將主要介紹如何通過(guò)reshape實(shí)現(xiàn)矩陣元素序列化,需要的小伙伴可以參考一下2021-12-12

