gpt4 book ai didi

python - 从任何小部件获取鼠标按下事件

转载 作者:行者123 更新时间:2023-12-05 01:59:43 28 4
gpt4 key购买 nike

我有一个 QMainWindow 应用程序,里面有多个小部件(按钮、标签等)。

当用户按下应用的任意位置时,我如何获得事件?

我尝试自定义 mousePressEvent() 函数,但是当按下其他小部件(按钮、标签等)时,它不接受该事件。

最佳答案

说明:

widgets 之间鼠标事件的处理是从children 到parents,也就是说,如果child 不接受事件(它不使用它)那么它将把事件传递给parent。例如,如果您按下 QPushButton,它会接受事件并且不会通知父级,这与不使用它的 QLabel 不同,因此事件会传递给父级。

工具:

另一方面,监听事件的方法一般有以下几种,例如:

  • 覆盖任何方法,如 mousePressEvent、keyPressEvent 等或事件或自定义事件方法。

  • 使用事件过滤器。

解决方案:

另一种方法是将以前的一些方法应用于所有小部件,但您可以为当前目标放弃所有这些方法,例如:

  • 在第一种和第二种方法中,它将涉及检测何时添加或删除小部件(使用 QEvent::ChildAddedQEvent::ChildRemoved)。

  • 在第一种方法中,它意味着重写多次不可能的方法。

通过以上,问题是在小部件方面受到攻击,但还有其他选择:

  • 重写Q{Core, GUI,}Applicationnotify()方法,验证它是一个widget并且属于窗口,它还意味着区分事件是否已被消费。

  • 监听与窗口 (QWindow) 关联的鼠标事件。

在这种情况下最合理的是第二种方法。

import sys

from PyQt5 import QtCore, QtWidgets


class MouseObserver(QtCore.QObject):
pressed = QtCore.pyqtSignal(QtCore.QPoint)
released = QtCore.pyqtSignal(QtCore.QPoint)
moved = QtCore.pyqtSignal(QtCore.QPoint)

def __init__(self, window):
super().__init__(window)
self._window = window

self.window.installEventFilter(self)

@property
def window(self):
return self._window

def eventFilter(self, obj, event):
if self.window is obj:
if event.type() == QtCore.QEvent.MouseButtonPress:
self.pressed.emit(event.pos())
elif event.type() == QtCore.QEvent.MouseMove:
self.moved.emit(event.pos())
elif event.type() == QtCore.QEvent.MouseButtonRelease:
self.released.emit(event.pos())
return super().eventFilter(obj, event)


class MainWindow(QtWidgets.QMainWindow):
pass


def main(args):
app = QtWidgets.QApplication(args)

w = MainWindow()
w.show()

mouse_observer = MouseObserver(w.window().windowHandle())
mouse_observer.pressed.connect(lambda pos: print(f"pressed: {pos}"))
mouse_observer.released.connect(lambda pos: print(f"released: {pos}"))
mouse_observer.moved.connect(lambda pos: print(f"moved: {pos}"))

app.exec_()


if __name__ == "__main__":
main(sys.argv)

关于python - 从任何小部件获取鼠标按下事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67658471/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com