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

2024-10-01 17:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

class CustomWidget(QtWidgets.QWidget):
    mouse_pressed_signal = QtCore.pyqtSignal(QtGui.QMouseEvent)

    def __init__(self):
        super().__init__()

    def mousePressEvent(self, i_qmouseevent):
        super(CustomWidget, self).mousePressEvent(i_qmouseevent)
        logging.debug("======== CustomWidget - mousePressEvent ========")
        self.mouse_pressed_signal.emit(i_qmouseevent)

问题

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

问题

我怎样才能解决这个问题?(或者有没有其他方法可以推荐?)重要的是我能够在custom_widget/hbox内的任何地方捕获鼠标点击(参见上面的代码)


Tags: 代码self区域signal部件地方custom鼠标
1条回答
网友
1楼 · 发布于 2024-10-01 17:22:46

如果您想收听其他小部件的mousePressEvent,可以使用eventFilter,如下所示:

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

相关问题 更多 >

    热门问题