禁用QscrollArea上的鼠标滚轮滚动

问题描述:

我想简单地停用QScrollArea上的鼠标滚轮滚动功能,只需单击右侧滚动条即可向下滚动,但我无法在Internet上找到任何解决方案。禁用QscrollArea上的鼠标滚轮滚动

app = QtGui.QApplication([]) 
sa = pg.QtGui.QScrollArea() 
win = pg.GraphicsWindow()  
sa.setWidget(win) 

的问题是,我有很多图形在我的滚动区域,当我试图鼠标滚轮的其中之一,该页面将与图形向上或向下滚动起来。 我无法找到调用“sa”来禁用鼠标滚轮滚动的方法。

我发现一些帖子讨论关于安装事件过滤器,但我不明白如何在这种情况下使用它们。例如,我试图用这个:

sa.viewport().installEventFilter(???) 

但我真的不明白什么参数传递和如何检查事件。

如果你能帮助我解决这个问题,请提前致谢。

你有正确的想法。事件过滤需要一个继承QObject的对象来监视相关事件。这些对象有一个eventFilter方法,它可以被重写以提供对所监视对象的所有事件的自定义处理。如果此方法针对给定事件返回True,则它不会再传播。通常使用的主要窗口,以提供事件过滤,像这样:

import sys 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.scroll = QtGui.QScrollArea() 
     self.widget = QtGui.QGraphicsView() 
     self.widget.setFixedSize(600, 600) 
     self.scroll.setWidget(self.widget) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.scroll) 
     self.scroll.viewport().installEventFilter(self) 

    def eventFilter(self, source, event): 
     if (event.type() == QtCore.QEvent.Wheel and 
      source is self.scroll.viewport()): 
      return True 
     return super(Window, self).eventFilter(source, event) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 100, 400, 300) 
    window.show() 
    sys.exit(app.exec_()) 
+0

我只是设法解决这个问题创造类: '类滚轮(pg.QtGui.QScrollArea): DEF __init __(个体): pg.QtGui.QScrollArea .__初始化__(个体) DEF wheelEvent(个体,EV): 如果ev.type() == QtCore.QEvent.Wheel: ev.ignore()' 然后创建这样的对象: 'SA =滚轮()' 我不知道这是否是最正确的方式,但我认为这是非常简单的 –

+0

@EdoardoBianchi。我展示的方法只是一个简单的(只有六行代码)。 – ekhumoro

我终于设法解决这个问题,使用此解决方案:

class Scroller(pg.QtGui.QScrollArea): 
    def __init__(self): 
     pg.QtGui.QScrollArea.__init__(self) 
    def wheelEvent(self, ev): 
     if ev.type() == QtCore.QEvent.Wheel: 
      ev.ignore() 

app = QtGui.QApplication([]) 
sa = Scroller() # <====== 
win = pg.GraphicsWindow()  
sa.setWidget(win)