即使没有人告诉它,为啥 QScrollArea 在多点触控上滚动?
Posted
技术标签:
【中文标题】即使没有人告诉它,为啥 QScrollArea 在多点触控上滚动?【英文标题】:Why does QScrollArea scroll on multi-touch even if nobody told it to?即使没有人告诉它,为什么 QScrollArea 在多点触控上滚动? 【发布时间】:2019-08-09 16:06:30 【问题描述】:我正在使用带有 Lubuntu 18.04 的多点触控显示器 (EIZO DuraVision FDF2382WT)。 我有一个带有 QLabel 作为小部件的 QScrollArea。 QLabel 有一个 QPixmap。用两个或更多手指触摸它会滚动图片。为什么会这样?根据我对the documentation 的理解,QTouchEvent 处理是可选的,除了总是接收它们的 QWindows。
我尝试将 AA_SynthesizeMouseForUnhandledTouchEvents 设置为 False,将 QScrollArea 和 QLabel 的 WA_AcceptTouchEvents 设置为 True 和 False。我没有看到任何变化。我尝试重新实现 QScrollArea.event、QScrollArea.scroll、QLabel.event 和滚动条 setValue 来记录调用,但没有打印任何内容。
import sys
from PyQt5 import Qt
qapp = Qt.QApplication(sys.argv)
picture = Qt.QPixmap('picture.png')
qlab = Qt.QLabel()
qlab.setPixmap(picture)
qsa = Qt.QScrollArea()
qsa.setWidget(qlab)
qsa.setGeometry(10, 30, 200, 200)
qsa.show()
sys.exit(qapp.exec_())
我原以为图片会留在原地,但它被拖了。使用鼠标或仅用一根手指拖动时没有任何反应。
【问题讨论】:
【参考方案1】:我终于解决了这个问题:它是gestures! 我用类似的东西残忍地禁用了它们
import sys
from PyQt5 import Qt
qapp = Qt.QApplication(sys.argv)
picture = Qt.QPixmap('picture.png')
qlab = Qt.QLabel()
qlab.setPixmap(picture)
MyScrollArea = Qt.QScrollArea
def event(self, event):
print('DEBUG: event type '.format(event.type()))
if event.type() in (Qt.QEvent.Gesture, Qt.QEvent.GestureOverride):
event.accept()
return True
else:
return super(MyScrollArea, self).event(event)
MyScrollArea.event = event
qsa = MyScrollArea()
qsa.setWidget(qlab)
qsa.setGeometry(10, 30, 200, 200)
qsa.show()
sys.exit(qapp.exec_())
【讨论】:
以上是关于即使没有人告诉它,为啥 QScrollArea 在多点触控上滚动?的主要内容,如果未能解决你的问题,请参考以下文章
为啥即使没有人在监控,zoneminder 监控功能也会持续使用摄像头