禁用QscrollA上的鼠标滚轮滚动

2024-04-19 04:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我发现了一些关于安装事件过滤器的帖子,但我不明白在这种情况下如何使用它们。例如,我尝试使用以下方法:

^{pr2}$

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

如果你能帮我解决这个问题,先谢谢你。在


Tags: 方法app图形sa事件互联网鼠标解决方案
2条回答

我终于用这个解决方案解决了这个问题:

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) 

你的想法是对的。事件筛选需要继承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_())

相关问题 更多 >