自定义QListWidget上的PyQt多点触控平移手势
我在写一个简单的记事本应用程序,想用它来学习基础的Python和PyQt,但遇到了一些问题。
具体来说,我想知道怎么调整QListWidget的多点触控滑动手势的灵敏度。
现在的情况是,当我用两个手指上下拖动时,列表似乎是根据我手指移动的每一个像素,上下移动一步。这并不是我自己实现的,列表控件本身就这样工作。
我希望移动的速度能和我手指的速度相匹配,也就是说,每移动x个像素的高度,就让列表中的项目上下移动一步。这样做可以吗?需要对手势系统进行大改动吗?我该怎么做呢?
我使用的是PyQt 4.8.3和Python 2.6。
2 个回答
0
很可能这个功能之所以存在,是因为你的操作系统把多点触控事件当成某种滚动操作来处理了。结果,QT接收到的其实是滚动的动作,而不是直接的多点触控动作。
1
虽然来得有点晚,但也许我可以帮助那些遇到这个问题的人:
解决办法是把 QListWidget
的滚动模式设置为 ScrollPerPixel
(而不是默认的 ScrollPerItem
):
list_widget.setVerticalScrollMode(list_widget.ScrollPerPixel)
这是一个简单的例子:
import sys
from PyQt5 import QtWidgets
# create app
app = QtWidgets.QApplication(sys.argv)
# create list widget
list_widget = QtWidgets.QListWidget()
# populate list widget with dummy items
for index in range(100):
list_widget.addItem(QtWidgets.QListWidgetItem('item {}'.format(index)))
# THIS IS THE IMPORTANT PART: set the scroll mode
list_widget.setVerticalScrollMode(list_widget.ScrollPerPixel)
# OPTIONAL: enable pan by mouse (and one-finger pan)
QtWidgets.QScroller.grabGesture(list_widget.viewport(),
QtWidgets.QScroller.LeftMouseButtonGesture)
# show the list widget
list_widget.show()
# run the event loop
app.exec_()
注意:这个例子还展示了如何用鼠标来平移,这在没有触摸屏的设备上测试时很有用。此外,鼠标平移设置还支持单指平移,除了默认的双指平移手势(至少在Windows上,已经在Surface Pro平板上测试过)。