Mousepressevent не работает с дочерними виджетами?

Итак, я пытался распечатать позицию мыши каждый раз, когда щелкал левой кнопкой мыши, но это работает только за пределами макета, и я не знаю, как это исправить. Мой графический интерфейс выглядит так:

enter image description here

import sys
from PyQt5 import QtGui, QtWidgets, QtCore
from untitled import Ui_Dialog


class AppWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.show()

    def mousePressEvent(self, a0: QtGui.QMouseEvent):
        print(a0.pos())


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = AppWindow()
    w.show()
    sys.exit(app.exec_())

Вот мой файл untitled.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.graphicsView = QtWidgets.QGraphicsView(Dialog)
        self.graphicsView.setObjectName("graphicsView")
        self.verticalLayout.addWidget(self.graphicsView)
        self.horizontalLayout.addLayout(self.verticalLayout)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "PushButton"))
1
0
185
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Событие mousePressEvent вызывается только в том случае, если виджет собирается обрабатывать эту информацию, поэтому, если в зоне, где вы щелкаете, есть другие дочерние виджеты, это событие не будет получено, поэтому вы получите щелчок только там, где нет другого виджета сверху. , поэтому решение в этих случаях - прослушивать событие через eventFilter:

import sys
from PyQt5 import QtGui, QtWidgets, QtCore
from untitled import Ui_Dialog


class AppWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.show()
        for w in self.findChildren(QtWidgets.QWidget)+[self]:
            w.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            if event.buttons() & QtCore.Qt.LeftButton:
                print(obj, "global pos:", event.globalPos(), 
                            "local pos", event.pos(),
                            "position with respect to self",
                            self.mapFromGlobal(obj.mapToGlobal(event.pos())))
        return super(AppWindow, self).eventFilter(obj, event)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = AppWindow()
    w.show()
    sys.exit(app.exec_())

@Lindau нет, в SO достаточно пометить ответ как правильный, чтобы OP (тот, кто спрашивает) указывал, что он решил свою проблему, пожалуйста, проверьте тур, чтобы вы знали больше правил SO.

eyllanesc 31.10.2018 12:43

Ах хорошо! Я проверю тур. Спасибо за помощь!

Lindau 31.10.2018 12:47

Другие вопросы по теме