我怎样才能在 child class 中捕捉到主 Window 上的鼠标点击

How can i capture a mouse clicks onto the main Window in a child class

我想在应用程序的 child class 中捕获对 MainWindow 的鼠标点击。 我尝试了以下但没有成功:

import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from abc import ABCMeta, abstractmethod

class BaseView(object):
    def __init__(self,parent, page=None):
        self.parent = parent
        self.page = page
    @abstractmethod
    def preprare_view(self):
        pass

    @abstractmethod
    def clean_up_view(self):
        pass

class FooView(BaseView):
    def __init__(self, parent, page):
        super(FooView, self).__init__(parent, page)
        self.parent = parent
        
    def mousePressEvent(self, QMouseEvent):
        print(parent.QMouseEvent.pos())
    def mouseReleaseEvent(self, QMouseEvent):
        cursor = QtGui.QCursor()
        print(parent.cursor.pos())

class Example(QtWidgets.QMainWindow):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()
    def initUI(self):
        self.foo = "fooview"
        self.Foo = FooView(self,self.foo)
        qbtn = QtWidgets.QPushButton('Quit', self)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)
        self.setGeometry(0, 0, 1024, 768)
        self.setWindowTitle('Quit button')
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint)
        self.show()
def main():
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

我想知道如何在 FooView child class 中捕获鼠标点击 - 这可能吗?

OP 使用的术语令人困惑,例如 FooView 是 BaseView 的子 class,但这与 Qt 无关,因此与这种情况无关,所以我将省略 class 并展示另一个 class 如何获取有关小部件的单击事件的信息的示例。

逻辑是创建一个class继承自QObject并应用事件过滤器到另一个widget,然后覆盖获取widget事件的eventFilter方法。

import sys
from PyQt5 import QtWidgets, QtGui, QtCore


class MouseObserver(QtCore.QObject):
    def __init__(self, widget):
        super(MouseObserver, self).__init__(widget)
        self._widget = widget
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, obj, event):
        if obj is self.widget:
            if event.type() == QtCore.QEvent.MouseButtonPress:
                print(event.pos(), QtGui.QCursor.pos())
            elif event.type() == QtCore.QEvent.MouseButtonRelease:
                print(event.pos(), QtGui.QCursor.pos())
        return super(MouseObserver, self).eventFilter(obj, event)


class Example(QtWidgets.QMainWindow):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        self.observer = MouseObserver(self)

        qbtn = QtWidgets.QPushButton("Quit", self)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)

        self.setGeometry(0, 0, 1024, 768)
        self.setWindowTitle("Quit button")
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint)
        self.show()


def main():
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()