Python 如何在布局中的小部件之间捕获MousePresseEvent?

Python 如何在布局中的小部件之间捕获MousePresseEvent?,python,pyqt,pyqt5,qmouseevent,Python,Pyqt,Pyqt5,Qmouseevent,我试图通过几个小部件检测区域内任何地方的鼠标点击。为此,我使用以下代码: custom_widget = CustomWidget() custom_widget.mouse_pressed_signal.connect(self.on_custom_label_mouse_pressed) main_layout_vbox.addWidget(custom_widget) hbox = QtWidgets.QHBoxLayout() custom_widget.setLayout(hbox)

我试图通过几个小部件检测区域内任何地方的鼠标点击。为此,我使用以下代码:

custom_widget = CustomWidget()
custom_widget.mouse_pressed_signal.connect(self.on_custom_label_mouse_pressed)
main_layout_vbox.addWidget(custom_widget)

hbox = QtWidgets.QHBoxLayout()
custom_widget.setLayout(hbox)

# Adding several widgets to hbox_l6

问题 这在单击任何子小部件时都有效,但有一个问题:如果在小部件之间单击(因此在小部件未覆盖的
hbox
布局区域中),则不会捕获
mousePressEvent

问题:
我怎样才能解决这个问题?(或者你可以推荐另一种方法吗?)重要的是,我能够在
自定义_widget
/
hbox
(参见上面的代码)

中的任何位置捕捉鼠标点击,如果你想听其他widget的
mousePressEvent
你可以使用
事件过滤器,如下所示:

from PyQt5 import QtCore, QtGui, QtWidgets
import random


class Widget(QtWidgets.QWidget):
    mouse_clicked_signal = QtCore.pyqtSignal(QtGui.QMouseEvent, QtWidgets.QWidget)

    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        hlay = QtWidgets.QHBoxLayout(self)

        for cls in (QtWidgets.QLabel,  QtWidgets.QPushButton, QtWidgets.QFrame, QtWidgets.QWidget):
            widget = cls()
            color = QtGui.QColor(*random.sample(range(255), 3))
            widget.setStyleSheet("background-color: {}".format(color.name()))
            hlay.addWidget(widget)

        for w in self.findChildren(QtWidgets.QWidget) +  [self]:
            w.installEventFilter(self)

        self.resize(640, 480)

    def eventFilter(self, watched, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            self.mouse_clicked_signal.emit(event, watched)
        return super(Widget, self).eventFilter(watched, event)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.mouse_clicked_signal.connect(print)
    w.show()
    sys.exit(app.exec_())

那很有效,谢谢。我不明白为什么我的方法不起作用,可能是因为版面可以处理事件过滤器,但不能处理鼠标信号?@sunyata版面不是视觉元素,问题是你没有覆盖
self
的mousePressEvent事件(我认为这是一个小部件)因此,您不会收听同一窗口的mousePressEvent,而只收听子窗口小部件的mousePressEvent。
from PyQt5 import QtCore, QtGui, QtWidgets
import random


class Widget(QtWidgets.QWidget):
    mouse_clicked_signal = QtCore.pyqtSignal(QtGui.QMouseEvent, QtWidgets.QWidget)

    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        hlay = QtWidgets.QHBoxLayout(self)

        for cls in (QtWidgets.QLabel,  QtWidgets.QPushButton, QtWidgets.QFrame, QtWidgets.QWidget):
            widget = cls()
            color = QtGui.QColor(*random.sample(range(255), 3))
            widget.setStyleSheet("background-color: {}".format(color.name()))
            hlay.addWidget(widget)

        for w in self.findChildren(QtWidgets.QWidget) +  [self]:
            w.installEventFilter(self)

        self.resize(640, 480)

    def eventFilter(self, watched, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            self.mouse_clicked_signal.emit(event, watched)
        return super(Widget, self).eventFilter(watched, event)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.mouse_clicked_signal.connect(print)
    w.show()
    sys.exit(app.exec_())