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

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

      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

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

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

              Created:
              Updated:
              Resolved:

                There are no open Gerrit changes