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_())