即使没有人告诉它,为啥 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 监控功能也会持续使用摄像头

即使在滚动时如何也不移动 QScrollArea 中的内容

有人可以告诉我为啥 foreachloop 不将 i 作为 1,这是一个用于检查它是不是存在于数组中的变量 [关闭]

如何使用 QScrollArea 使滚动条出现

有人能告诉我为啥这段代码似乎可以工作,但不能……拜托?

有人能告诉我为啥当我的游戏中的相机移动时一切都会振动吗?