wheelEvent上的水平滚动,移位太快

时间:2016-07-06 21:24:22

标签: python qt pyqt5

我在MyView上有200个来自QGraphicsView的对象。我用鼠标滚轮垂直滚动,一切都很顺畅。我认为这是Qt的默认实现。

我实现了Shift +滚轮水平滚动,水平滚动条在单轮事件上跳了一大步 - 比垂直滚动条大10倍。

基本上,相同的车轮事件会使水平滚动条比垂直滚动条驱动10倍。

如何减慢水平滚动条的速度?

好吧,我尝试减少原始事件的angleDelta值,如event.angleDelta()/10,以生成新的轮事件,并使用新事件来驱动水平滚动条。这有效,但似乎太复杂了。

我还注意到它是Shift修饰符,它会影响水平滚动条的行为。如果我在没有Shift修改器的情况下self.horizontalBar().wheelEvent(event),则水平条滚动速度会慢10倍。这很奇怪。为什么按Shift键会改变水平滚动行为?!

import sys
from PyQt5.Qt import QGraphicsScene, QGraphicsView, QGraphicsTextItem, QApplication, QWheelEvent, Qt


class MyView(QGraphicsView):
    def wheelEvent(self, event: QWheelEvent):
        if event.modifiers() == Qt.ShiftModifier:
            self.horizontalScrollBar().wheelEvent(event)
        else:
            self.verticalScrollBar().wheelEvent(event)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    scene = QGraphicsScene()
    view = MyView(scene)

    # Generate 200 objects, 100 on x and 100 on y.
    for i in range(100):
        obj_on_x = QGraphicsTextItem("X" + str(i))
        obj_on_x.setX(i * 100)
        scene.addItem(obj_on_x)

        obj_on_y = QGraphicsTextItem("Y" + str(i))
        obj_on_y.setY(i * 100)
        scene.addItem(obj_on_y)

    view.show()
    sys.exit(app.exec_())

2 个答案:

答案 0 :(得分:0)

为了降低两个滚动条的速度,我将与它们交互以更改其值(在我的代码中,我使用Ctrl将水平滚动条水平移动,使用Shift垂直移动滚动条)

def wheelEvent(self, event):

    delta = event.angleDelta().y()

    if event.modifiers() & Qt.ControlModifier:
        x = self.horizontalScrollBar().value()
        self.horizontalScrollBar().setValue(x - delta)

    elif event.modifiers() & Qt.ShiftModifier:
        y = self.verticalScrollBar().value()
        self.verticalScrollBar().setValue(y + delta)

答案 1 :(得分:0)

完成此操作的另一种方法是触发 SliderSingleStepAdd or SliderSingleStepSub triggerAction函数执行操作。

这些滚动似乎以适当的滚动速度移动,因为它可以应用自然会使用的任何增量。

def wheelEvent(self, event: QtGui.QWheelEvent):

    scrollbar = self.verticalScrollbar()
    if (event.modifiers() == QtCore.Qt.ShiftModifier):
        scrollbar = self.horizontalScrollBar()

    action = QtWidgets.QAbstractSlider.SliderSingleStepAdd
    if (event.angleDelta().y() > 0):
        action = QtWidgets.QAbstractSlider.SliderSingleStepSub

    scrollbar.triggerAction(action)