Uploaded image for project: 'Qt for Python'
  1. Qt for Python
  2. PYSIDE-2763

eventFilter get instance of base QEvent type, instead of QDragEnterEvent, QDropEvent

    XMLWordPrintable

Details

    • Bug
    • Resolution: Duplicate
    • Not Evaluated
    • None
    • 6.7.0
    • PySide
    • None
    • Windows 11, x64
      python 3.10.14
    • Windows

    Description

      When we install eventFilter for the QWidget, then method eventFilter gets event object, which is instance of base QEvent type (but it have to be some derived type, which depends on the event type).

      from __future__ import annotations
      
      from typing import TYPE_CHECKING
      
      from PySide6.QtCore import QObject, QEvent
      from PySide6.QtWidgets import QApplication, QWidget
      
      if TYPE_CHECKING:
          from PySide6.QtGui import QDragEnterEvent
      
      
      class MainWindow(QWidget):
          def __init__(self):
              super().__init__()
      
              self._drop_processor = DropProcessor()
      
              self.setAcceptDrops(True)
              self.installEventFilter(self._drop_processor)
      
          # All works well, when we are using dragEnterEvent method instead of installEventFilter
          # def dragEnterEvent(self, event: QDragEnterEvent):
          #     print(f'dragEnterEvent {event} type: {type(event)}')
          #     print(f'mimeData: {event.mimeData()}')
          #     event.acceptProposedAction()
      
      
      class DropProcessor(QObject):
          def eventFilter(self, watched: QObject, event: QEvent):
              if event.type() == QEvent.DragEnter:
                  print(f'drag eventFilter:\n\tevent.type(): {event.type()}\n\tevent: {event}\n\ttype(event): {type(event)}')
                  # We'll get the next error here if we try to get event.mimeData()
                  # AttributeError: 'PySide6.QtCore.QEvent' object has no attribute 'mimeData'
                  # event.mimeData()
                  event.setAccepted(True)
                  return True
              elif event.type() == QEvent.Drop:
                  print(f'drop eventFilter:\n\tevent.type(): {event.type()}\n\tevent: {event}\n\ttype(event): {type(event)}')
                  return True
              else:
                  return super().eventFilter(watched, event)
      
      
      if __name__ == '__main__':
          app = QApplication()
          main_window = MainWindow()
          main_window.show()
          app.exec() 

      Expected output:

      drag eventFilter:
          event.type(): 60
          event: <PySide6.QtGui.QDragEnterEvent(...
          type(event): <class 'PySide6.QtGui.QDragEnterEvent'>
      drop eventFilter:
          event.type(): 63
          event: <PySide6.QtGui.QDropEvent(...
          type(event): <class 'PySide6.QtGui.QDropEvent'>

       

      Actual output:

      drag eventFilter:
          event.type(): 60
          event: <PySide6.QtCore.QEvent(QEvent::DragEnter)>
          type(event): <class 'PySide6.QtCore.QEvent'>
      drop eventFilter:
          event.type(): 63
          event: <PySide6.QtCore.QEvent(QEvent::Drop)>
          type(event): <class 'PySide6.QtCore.QEvent'>

       

      So, we cannot use methods like event.mimeData() and others.

      The code works well in PySide6 6.6.0; 6.6.3.1

      Attachments

        Issue Links

          No reviews matched the request. Check your Options in the drop-down menu of this sections header.

          Activity

            People

              crmaurei Cristian Maureira-Fredes
              ivankosik Ivan Kosik
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Gerrit Reviews

                  There are no open Gerrit changes