我在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_())
答案 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)