QwtPlotZoomer图像鼠标右键返回原图坐标出现问题解决方案

QwtPlotZoomer图像鼠标右键返回原图坐标出现问题解决方案

问题描述:
在一个绘制函数waveP()里,主要代码:

    // 设置 x 轴和 y 轴范围
    ui->qwtPlot->setAxisScale(QwtPlot::xBottom, double(trace_first), double(trace_first) + double(x_size));
    ui->qwtPlot->setAxisScale(QwtPlot::yLeft, 0.0, m_nTraceLen);

    // 重新绘制图形
    ui->qwtPlot->replot();

每次调用我都会给它不同的x轴坐标,例如从0-100,从100-200,… 从500-900等,问题是我使用QwtPlotZoomer对图像进行缩放操作时发现,当鼠标右键点击按理来说返回初始大小,但是它坐标值变了,QwtPlotZoomer初始化的时候取的一个坐标轴,他以这个为基准,比如我的ui->qwtPlot刚展示出来的时候,我还没有载入数据,还没有绘图,他就以这个默认的坐标为基准,当你点击鼠标右键返回,发现坐标是这个,不是你修改后的。


为了解决这个问题,我尝试在初始化zommer的时候设置它默认的坐标,我以为是zoomer->setZoomBase(zoomBaseRect);这样设置一个矩阵上去,发现没用。


后来发现可以在重载zoom的恢复函数undoZoom,这样

#include "Zoomer.h"
#include "qwt_scale_widget.h"
#include "qwt_plot.h"

Zoomer::Zoomer(QwtPlotCanvas *canvas )
  : QwtPlotZoomer(canvas)
{
}

bool Zoomer::eventFilter(QObject *object, QEvent *event)
{
  if (object == canvas() && event->type() == QEvent::MouseButtonRelease)
  {
      QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
      if (mouseEvent->button() == Qt::RightButton)
      {
          undoZoom(); // 在鼠标右键释放事件中调用 undoZoom()
      }
  }
  return QwtPlotZoomer::eventFilter(object, event);
}

void Zoomer::undoZoom()
{
  // 在这里添加你想要执行的还原操作

  z_qwtPlot->setAxisScale(QwtPlot::xBottom, xMin, xMax);
  z_qwtPlot->setAxisScale(QwtPlot::yLeft, yMin, yMax);
  z_qwtPlot->replot();

  qDebug() << "undoZoom" << "   xMin:" << xMin << "   xMax:" << xMax;
}

并且发现他需要和每次绘图的地方放一起,这样

    fun_for_zommer();//这里用于处理zoomer

    // 设置 x 轴和 y 轴范围
    ui->qwtPlot->setAxisScale(QwtPlot::xBottom, double(trace_first), double(trace_first) + double(x_size));
    ui->qwtPlot->setAxisScale(QwtPlot::yLeft, 0.0, m_nTraceLen);

    // 重新绘制图形
    ui->qwtPlot->replot();

fun_for_zommer该函数主要是为了实现重载返回函数,让里面直接执行重新绘制,就正常显示了,至于zoomer按理来说应该如何操作,源码没仔细看也没看明白,这里反正是一个解决办法。

void MainWindow::fun_for_zommer(){
    QwtPlot* qwtPlot = ui->qwtPlot;
    m_canvas = qobject_cast<QwtPlotCanvas*>(qwtPlot->canvas());
    if (m_canvas) {
        // 转换成功,进行后续操作
    } else {
        // 转换失败,处理错误
        qDebug() << "无法将QWidget转换为QwtPlotCanvas";
    }

    if(m_zoomer){
        qDebug() << "存在";
        delete m_zoomer;
        m_zoomer = nullptr;
    } else {
        qDebug() << "不存在";
    }

//    m_zoomer = new Zoomer(m_canvas, ui->qwtPlot->canvas()->rect(), true);
    m_zoomer = new Zoomer(m_canvas);
    // m_zoomer.initialRect = ui->qwtPlot->axisScaleRect(QwtPlot::xBottom, QwtPlot::yLeft) ;
    m_zoomer->xMin = qwtPlot_scale[0] ;
    m_zoomer->xMax = qwtPlot_scale[1] ;
    m_zoomer->yMin = qwtPlot_scale[2];
    m_zoomer->yMax = qwtPlot_scale[3];
    m_zoomer->z_qwtPlot = ui->qwtPlot;
}

Written with StackEdit中文版.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值