禁用QscrollArea上的鼠标滚轮滚动

时间:2017-10-14 14:46:30

标签: python events pyqt mousewheel qscrollarea

我想简单地禁用QScrollArea上的鼠标滚轮滚动,以便只通过点击右侧滚动条向下滚动,但我在互联网上找不到任何解决方案。

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

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

我发现了一些讨论安装事件过滤器的帖子,但在这种情况下我无法理解如何使用它们。例如,我试图使用它:

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

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

如果您可以帮我解决这个问题,请提前感谢您。

2 个答案:

答案 0 :(得分:0)

你有正确的想法。事件过滤需要一个继承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_())

答案 1 :(得分:0)

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

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)