QCustomPlot窗口缩放导致坐标轴刻度重叠

问题复现

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //设置鼠标拖拽图像和鼠标滚轮缩放图像
    ui->widget->setInteractions(QCP::iRangeDrag |QCP::iRangeZoom);

    //先添加一条曲线
    ui->widget->addGraph();
    //设置x轴刻度线的数据的格式,默认会有6位小数
    ui->widget->xAxis->setNumberFormat("f");
    //设置数据
    QVector<double> keyVector;
    QVector<double> valueVector;
    for(int i = 0; i < 5; i++)
    {
        keyVector.append(i);
        valueVector.append(2 * i + 3);
    }
    //将数据添加到曲线上
    ui->widget->graph(0)->setData(keyVector, valueVector);
    ui->widget->graph(0)->rescaleValueAxis();
    ui->widget->xAxis->setRange(0, 5);
    //重新绘制
    ui->widget->replot();
}

Widget::~Widget()
{
    delete ui;
}

问题效果展示
在这里插入图片描述

解决代码

让我们先看一看 ​​QCustomPlot 的 ResizeEvent​​做了什么

/*! \internal
  
  Event handler for a resize of the QCustomPlot widget. The viewport (which becomes the outer rect
  of mPlotLayout) is resized appropriately. Finally a \ref replot is performed.
*/
void QCustomPlot::resizeEvent(QResizeEvent *event)
{
  Q_UNUSED(event)
  // resize and repaint the buffer:
  setViewport(rect());
  replot(rpQueuedRefresh); // queued refresh is important here, to prevent painting issues in some contexts (e.g. MDI subwindow)
}

可以看到只是将​​Viewport 设置位当前窗口的大小。联合上面的现象我们可以得出 视图大小是一个矩形。无论视图有多大或者多小,QCustomPlot都会将整个图像展示到这个视图大小中(即使出现重叠的现象)​​ 当视图的矩形较大,而窗体的矩形较小。那么就会出现下图显示的效果。图像没有被缩放,但是由于窗体矩形变小。所以只能观察到部分图像。

void MyCustomPlot::resizeEvent(QResizeEvent *event)
{
    if(!initViewRect_.isNull())
    {
        if(rect().width() < initViewRect_.width() || rect().height() < initViewRect_.height())
        {
            this->setViewport(QRect(0, 0, initViewRect_.width(), initViewRect_.height()));
            QWidget::resizeEvent(event);
            replot();
            return;
        }
        else
        {
            return QCustomPlot::resizeEvent(event);
        }
    }
    return QCustomPlot::resizeEvent(event);
}

解决效果

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值