(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库的知识请查看下面的相关链接
本文向大家介绍Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例,包括了Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例的使用技巧和注意事项,需要的朋友参考一下 首先要了解QChartView、QChart、QLineSeries、QValueAxis的实体之间的关系,例如一个QChartView中可以包含几个QValueA
本文向大家介绍Qt图形图像开发之曲线图表模块QChart库坐标轴和数据不对应、密集的散点图无法显示问题解决方法,包括了Qt图形图像开发之曲线图表模块QChart库坐标轴和数据不对应、密集的散点图无法显示问题解决方法的使用技巧和注意事项,需要的朋友参考一下 QChart坐标轴和数据不对应问题描述: 结果发现,数据系列中的点(4,10)在坐标系中的坐标不是(4,10) 原因在于,轴和数据系列没有连接。
本文向大家介绍Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例,包括了Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例的使用技巧和注意事项,需要的朋友参考一下 最近接到一个Qt QChart曲线图美化的需求,画一个折线图,关
本文向大家介绍Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例,包括了Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例的使用技巧和注意事项,需要的朋友参考一下 我们在开发过程中对于表格使用频率还是挺高的,使用QT
我最近在折线图中添加了放大和平移功能。现在我想添加一个复位按钮或类似的东西,当按下图形回到正常位置/形状时。目前,我正在绘制动态数据,每10秒更新一次。 先谢谢你。
本文向大家介绍Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法及QTableView与QTableWidget区别,包括了Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法及QTableView与QTableWidget区别的使用技巧和注意事项,需要的朋友参考一下 QTableView是Qt中用来把数据集以表格形式提供给用户的一个控件 QTableView