【问题标题】:Pyqt Wheel eventPyqt Wheel 事件
【发布时间】:2013-11-21 14:43:11
【问题描述】:

我实现了一个图像浏览器,在其中我使用鼠标的滚轮事件来显示下一张图像。问题是,如果用户滚动得太快,滚轮的位置值会跳过并吞下两者之间的值。有人知道我该如何克服这个问题吗?如果我慢慢滚动,我会得到一个减小的值(-1,-2,-3);如果我快速滚动,我会得到类似(-1,-5,-6,-11)的东西。该问题出现在 WindowsXP 和 7 上。

这是一个示例代码。

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

#############Define MyWindow Class Here ############
class MyWindow(QMainWindow):
##-----------------------------------------
  def __init__(self):
    QMainWindow.__init__(self)
    self.label = QLabel("No data")
    self.label.setGeometry(100, 200, 100, 100)
    self.setCentralWidget(self.label)
    self.setWindowTitle("QMainWindow WheelEvent")
    self.x = 0
##-----------------------------------------
  def wheelEvent(self,event):
    self.x =self.x + event.delta()/120
    print self.x
    self.label.setText("Total Steps: "+QString.number(self.x))
##-----------------------------------------
##########End of Class Definition ##################


def main():
  app = QApplication(sys.argv)
  window = MyWindow()
  window.show()
  return app.exec_()

if __name__ == '__main__':
 main()

【问题讨论】:

  • 你用的是什么鼠标?车轮是“咔哒”还是“光滑”? event.delta() 的值是否保持不变?我的鼠标滚轮是“clicky”,增量是恒定的 ±120 个单位。
  • 我的有点平滑,值不会保持不变。如果我快速滚动,它会以 120 步的速度运行,例如120,120,240,360。

标签: python windows events pyqt mousewheel


【解决方案1】:

这里似乎没有任何问题,因为 Qt 正确地报告了鼠标滚轮滚动的单位数。

一些鼠标驱动程序支持加速滚动,这意味着当滚轮旋转得更快时,报告的滚动单元的数量会逐渐增加。单位为 0.125 度,大多数鼠标的基线滚动速度为每“缺口”120 个单位。随着车轮旋转得更快(即 120、240、360 等),加速度只是将基线速度乘以一个增加的因子。

所以在QWheelEvent 中,滚动的“缺口”数由以下公式计算:

    # PyQt5/PySide2
    event.angleDelta().y() // baseline_speed

    # PyQt4/PySide
    event.delta() // baseline_speed 

这正是问题中的示例代码所做的。

如果你想分别注册每个“notch/step”,你可以只使用一个循环:

    steps = event.angleDelta().y() // 120
    vector = steps and steps // abs(steps) # 0, 1, or -1
    for step in range(1, abs(steps) + 1):
        self.x += vector
        print(self.x)

或者你可以忽略加速度,只为每个车轮事件注册矢量:

    delta = event.angleDelta().y()
    self.x += (delta and delta // abs(delta))
    print(self.x)

【讨论】:

  • 感谢您的精彩回答!
  • 基本上仍然正确,即使 event.delta() 已被弃用并且我们现在有 pixelDelta() 或 angleDelta()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 2012-04-20
  • 1970-01-01
  • 2012-03-15
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多