我想简单地禁用QScrollArea上的鼠标滚轮滚动,以便只通过点击右侧滚动条向下滚动,但我在互联网上找不到任何解决方案。
app = QtGui.QApplication([])
sa = pg.QtGui.QScrollArea()
win = pg.GraphicsWindow()
sa.setWidget(win)
问题是我的滚动区域中有很多图形,当我尝试鼠标滚动其中一个图形时,页面将与图形一起向上或向下滚动。 我找不到调用“sa”来禁用鼠标滚轮滚动的方法。
我发现了一些讨论安装事件过滤器的帖子,但在这种情况下我无法理解如何使用它们。例如,我试图使用它:
sa.viewport().installEventFilter(???)
但我真的不明白要传递什么参数以及如何检查事件。
如果您可以帮我解决这个问题,请提前感谢您。
答案 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)