QtChart 启用缩放功能setRubberBand()之后,setRange(min, max)出现的问题
因项目需要,用qtchart绘制的图形需要框选放大,这里用到了setRubberBand()函数,但是在左键复原的时候出现了问题。
先铺垫一下,博主是重写了chartview的鼠标事件的mouserelease(event)来触发复原的信号。
复原的原理:记录初始时的坐标轴的range,接收到复原信号后,将原坐标轴重置setRange()即可。
问题来了
先来看看初始时的图形:
所有波形的时间轴为一样的,通过框选任意波形选择框选的时间轴将所有波形全部放大,
通过点击鼠标左键复原
图中随便点击哪个波形,需要是要所有波形恢复正常,这时问题出现了,除了被点击的波形之外其他波形都恢复正常,此时右键点击其他波形,第一个波形恢复正常,被点击的波形出现同样的问题。
经过梳理发现问题可能就出现在setRubberBand()上,通过查询果不其然,上段文档
[virtual protected] void QChartView::mouseReleaseEvent(QMouseEvent *event)
Reimplemented from QWidget::mouseReleaseEvent().
If the left mouse button is released and the rubber band is enabled, the event event is accepted and the view is zoomed into the rectangle specified by the rubber band. If releasing the right mouse button triggered the event, the view is zoomed out.
大概意思是:
重新实现从QWidget: mouseReleaseEvent ()。
如果松开鼠标左键并启用了橡皮筋,则接受事件事件并将视图放大到橡皮筋指定的矩形中。如果释放鼠标右键触发事件,视图将缩小。
好了,得到这个答案之后,再来看看重新实现的mouseReleaseEvent ()。
因为我只需要右键松开触发复原的信号,所以这个mouseReleaseEvent()事件到重写的mychartview中就完成使命了,不用将事件继续传递。
void mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
if(is_Pressed_)
{
QChartView::mouseReleaseEvent(event);
emit sgl_rangeChange(this);
is_Pressed_ = false;
return;
}
}
else
{
emit sgl_recoverRange(this);
}
//QChartView::mouseReleaseEvent(event);
}
将**QChartView::mouseReleaseEvent(event);**注释掉即可
PS:
有小伙伴需要用到绘图时,可以看看qcustomplot,个人觉得这个库要比qtchart好用,(项目开始时用的qtchart,后面就改用了qcustomplot ( -_-))