禁用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_())
答
我终于设法解决这个问题,使用此解决方案:
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)
我只是设法解决这个问题创造类: '类滚轮(pg.QtGui.QScrollArea): DEF __init __(个体): pg.QtGui.QScrollArea .__初始化__(个体) DEF wheelEvent(个体,EV): 如果ev.type() == QtCore.QEvent.Wheel: ev.ignore()' 然后创建这样的对象: 'SA =滚轮()' 我不知道这是否是最正确的方式,但我认为这是非常简单的 –
@EdoardoBianchi。我展示的方法只是一个简单的(只有六行代码)。 – ekhumoro