ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – Pyqt Wheel事件

2019-05-29 03:45:03  阅读:401  来源: 互联网

标签:python windows events pyqt mousewheel


我实现了一个图像浏览器,我使用鼠标的滚轮事件来显示下一个图像.问题是,如果用户滚动到快速,滚轮的位置值跳过并吞下其间的值.有谁知道我怎么能克服这个问题?这是一个示例代码.如果我慢慢滚动,我会得到一个递减值-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()

解决方法:

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

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

因此,在QWheelEvent中,滚动的“凹槽”数量由以下公式计算:

    event.delta() // baseline_speed

这正是问题中的示例代码已经完成的内容.

如果你想分别注册每个“缺口/步骤”,你可以使用一个循环:

    steps = event.delta() // 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.delta()
    self.x += (delta and delta // abs(delta))
    print(self.x)

标签:python,windows,events,pyqt,mousewheel
来源: https://codeday.me/bug/20190529/1175957.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有