问题复现
#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);
}