【问题标题】:Disable mouse wheel scroll on QscrollArea在 QscrollArea 上禁用鼠标滚轮滚动
【发布时间】:2017-10-14 14:46:30
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: python events pyqt mousewheel qscrollarea


    【解决方案1】:

    你的想法是对的。事件过滤需要一个继承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() 然后像这样创建对象:sa = Scroller() 我不知道这是不是最正确的方法,但我认为它真的很简单跨度>
    • @EdoardoBianchi。我展示的方法很简单(只有六行代码)。
    【解决方案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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多