Вопрос по mouseevent, python, pyqt4, events – eventFilter на QWidget с PyQt4

2

У меня есть QMainWindow, которое содержитDrawingPointsWidget, Этот виджет рисует красные точки в случайном порядке. Я отображаю координаты мыши в строке состояния QMainWindow, устанавливая фильтр событий для события MouseHovering, используяself.installEventFilter(self) и путем реализацииeventFilter() метод. Оно работает. Однако я хочу получить координаты мыши в этом виджете красных точек, а не в QMainWindow. Поэтому я хочу, чтобы в строке состояния отображалось [0, 0], когда мышь находится в верхнем левом углу виджета точек, а не в QMainWindow. Как я могу это сделать? Я старалсяself.installEventFilter(points) но ничего не происходит

Ниже вы найдете рабочий кусок кода.

РЕДАКТИРОВАТЬ 1

Кажется, что если я напишуpoints.installEventFilter(self),QtCore.Event.MouseButtonPressed событие обнаружено, толькоHoverMove не является. ИтакHoverMove событие не обнаружено на моемDrawingPointsWidget который являетсяQWidget, Удивительно, ноHoverMove событие обнаружено наQPushButton который являетсяQAbstractButton который являетсяQWidget тоже! Мне нужно написатьbutton.installEventFilter(self)

import sys
import random
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *

class MainWindow(QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.__setUI()

    def __setUI(self, appTitle="[default title]"):
        self.statusBar()

        mainWidget = QWidget()
        vbox = QVBoxLayout()

        button = QPushButton("Hello")
        vbox.addWidget( button )

        points = DrawingPointsWidget()

        vbox.addWidget(points)

        mainWidget.setLayout(vbox)
        self.setCentralWidget(mainWidget)
        self.installEventFilter(self)

    def eventFilter(self, object, event):

        if event.type() == QtCore.QEvent.HoverMove:
            mousePosition = event.pos()
            cursor = QtGui.QCursor()

            self.statusBar().showMessage(
                "Mouse: [" + mousePosition.x().__str__() + ", " + mousePosition.y().__str__() + "]"
                + "\tCursor: [" + cursor.pos().x().__str__() + ", " + cursor.pos().y().__str__() + "]"

            )

            return True

        elif event.type() == QtCore.QEvent.MouseButtonPress:
            print "Mouse pressed"
            return True

        return False

class DrawingPointsWidget(QWidget):
    ""
    def __init__(self):
 ,       super(QWidget, self).__init__()
        self.__setUI()

    def __setUI(self):

        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('Points')
        self.show()

    def paintEvent(self, e):
        "Re-implemented method"

        qp = QtGui.QPainter()
        qp.begin(self)
        self.drawPoints(qp)
        qp.end()

    def drawPoints(self, qp):

        qp.setPen(QtCore.Qt.red)

        "Need to get the size in case the window is resized -> generates a new paint event"
        size = self.size()

        for i in range(1000):
            x = random.randint(1, size.width()-1 )
            y = random.randint(1, size.height()-1 )
            qp.drawPoint(x, y)


def main():
    app = QApplication(sys.argv)
    #window = WidgetsWindow2()
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

Ваш Ответ

1   ответ
5

фильтр событий должен быть установленот объект, который вы хотите посмотреть:

points.installEventFilter(self)

Во-вторых, событие, которое вам нужно слушать, этоMouseMove неHoverMove:

if event.type() == QtCore.QEvent.MouseMove:

Наконец, вам нужно включить отслеживание мыши на целевом виджете:

class DrawingPointsWidget(QWidget):
    def __init__(self):
        super(QWidget, self).__init__()
        self.setMouseTracking(True)
Отлично! Спасибо :) kaligne

Похожие вопросы