1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > qchart实现图片缩放 qt_Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例...

qchart实现图片缩放 qt_Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例...

时间:2022-06-18 05:50:17

相关推荐

qchart实现图片缩放 qt_Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例...

1、使用QChartView来缩放

(1)用鼠标框选一个矩形,把图放大到这个矩形

QChartView::setRubberBand(QChartView::RectangleRubberBand);//XY方向同时放大到鼠标画出的矩形大小(也可以设置为只放大X轴或Y轴)

(2)setRubberBand函数同时也能使鼠标右键,具备缩小图的功能。

2、使用Qchart来平移和缩放

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全部撤销

3、使用QValueAxis或者QDateTimeAxis来平移和缩放

原理就是,通过设置X/Y轴的范围来实现平移和缩放。

例如,当前显示X的显示范围为[20, 50],如果我们把X轴的显示范围扩大到[0, 80],这样做的效果就是显示的图形变小了,也就实现了缩放。

例如,当前显示X的显示范围为[0, 30],如果我们把X轴的显示范围扩大到[10, 40],这样做的效果就是显示的图形左移了,也就实现了平移。

示例代码:

QValueAxis *axisX = dynamic_cast(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(为什么+代表左移?仔细想想就明白了)

放缩与平移的示例代码同理

Qt曲线图表模块QChart库缩放、平移实例

运行效果如下:

.h文件代码

#ifndef QTCHARTDEMOZOOM_H_38020FA5_FC74_4395_A807_61BF924D2F06

#define QTCHARTDEMOZOOM_H_38020FA5_FC74_4395_A807_61BF924D2F06

#include

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

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库的知识请查看下面的相关链接

时间: -03-09

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。