QScrollArea控件是一个好东西。它里面有一个Qwidget控件。Qwidget控件的功能不必多说,和matplotlib连接就靠它。当Qwidget控件的大小超过了QScrollArea的大小之后,会有一个可拖动的滚动条。可拖动的滚动条是可以接受鼠标滚轮事件而向上向下滚动的。为了实现qmlcanvas(matplotlib.figurecanvas)的缩放功能,我连接了Qwidget的鼠标滚动事件和matplotlib。为此我设置了一个开关,来切换鼠标滚动是触发QScrollArea控件的滚动条,还是触发Qwidget控件内的鼠标滚动事件:。解决思路如下:
1.为QScrollArea安装事件过滤器,当开关开时,发往该控件的鼠标滚动事件被拦截,不做响应,当开关关时,发往该处的事件作响应。
2.重写QScrollArea这个类,重写wheelEvent事件。
方法1比较简单,但是我测试了一下,并不能很好的起到拦截作用。调用了event.accept()方法之后的事件依然会被响应。因此转用第二种方法:我重写了这个类,重写whellEvent事件,当开关关闭时,将事件传递给父类,在父类中响应
from PyQt5.QtWidgets import QScrollArea as QSLA
class QcScrollArea(QSLA):
def __init__(self,parent):
QSLA.__init__(self,parent)
def setRcs(self,Rcs):
self.Rcs=Rcs
def wheelEvent(self,event):
if self.Rcs.zoomswi==True:
pass
else:
QSLA.wheelEvent(self, event)
pass