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中文版.