2016-03-14 3 views
1

Я пытаюсь использовать mouseMoveEvent и mousePressEvent в PyQt5 и Python3.5, но нет ничего, когда я нажимаю на мышь. Мой код следующий: есть ли что-то не так?Почему mouseMoveEvent ничего не делает в PyQt5

from PyQt5 import QtWidgets, QtGui, QtCore 

class Window(QtWidgets.QMainWindow): 
    def __init__(self): 
     QtWidgets.QMainWindow.__init__(self) 
     widget = QtWidgets.QWidget(self) 
     layout = QtWidgets.QVBoxLayout(widget) 
     self.graphicsView = QtWidgets.QGraphicsView() 
     self.graphicsView.setCursor(QtCore.Qt.CrossCursor) 
     self.graphicsView.setObjectName("graphicsView") 
     layout.addWidget(self.graphicsView) 
     self.setCentralWidget(widget) 

    def mouseMoveEvent(self, event): 
     if event.buttons() == QtCore.Qt.NoButton: 
      print("Simple mouse motion") 
     elif event.buttons() == QtCore.Qt.LeftButton: 
      print("Left click drag") 
     elif event.buttons() == QtCore.Qt.RightButton: 
      print("Right click drag") 

    def mousePressEvent(self, event): 
     if event.button() == QtCore.Qt.LeftButton: 
      print("Press!") 

if __name__ == '__main__': 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    win = Window() 
    win.show() 
    sys.exit(app.exec_()) 

ответ

5

Во-первых, необходимо включить mouse-tracking:

 self.graphicsView.setMouseTracking(True) 

Затем вы можете использовать подкласс QGraphicsView:

class GraphicsView(QtWidgets.QGraphicsView): 
    def mouseMoveEvent(self, event): 
     if event.buttons() == QtCore.Qt.NoButton: 
      print("Simple mouse motion") 
     elif event.buttons() == QtCore.Qt.LeftButton: 
      print("Left click drag") 
     elif event.buttons() == QtCore.Qt.RightButton: 
      print("Right click drag") 
     super(GraphicsView, self).mouseMoveEvent(event) 

    def mousePressEvent(self, event): 
     if event.button() == QtCore.Qt.LeftButton: 
      print("Press!") 
     super(GraphicsView, self).mousePressEvent(event) 

Или установить событие-фильтр:

 self.graphicsView.viewport().installEventFilter(self) 
     ... 

    def eventFilter(self, source, event): 
     if event.type() == QtCore.QEvent.MouseMove: 
      if event.buttons() == QtCore.Qt.NoButton: 
       print("Simple mouse motion") 
      elif event.buttons() == QtCore.Qt.LeftButton: 
       print("Left click drag") 
      elif event.buttons() == QtCore.Qt.RightButton: 
       print("Right click drag") 
     elif event.type() == QtCore.QEvent.MouseButtonPress: 
      if event.button() == QtCore.Qt.LeftButton: 
       print("Press!") 
     return super(Window, self).eventFilter(source, event) 
+0

Он работает , большое спасибо. – Philokey

1

Я уверен, что ваши события обрабатываются внутри QGraphicsView. Вы должны больше узнать о распространении событий. Попробуйте, не добавляя дополнительных виджетов поверх окна. И не забывайте свойство abt MouseTracking, которое по умолчанию ложно, а события перемещения мыши без кнопок вообще не происходят.

Я бы рекомендовал прочитать статью this. Это довольно старый, но все же актуальный. Также события мыши в QGraphicsView обрабатываются по-другому, читайте docs для более подробной информации.

Sory нет образцов кода, так как я разработчик C++.

Смежные вопросы