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

所属分类: 软件编程 / C 语言 阅读数: 110
收藏 0 赞 0 分享

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

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

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

运行效果如下:

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

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多