[PyQt] Bug in QAbstractNativeEventFilter in PyQt 5.1.1?

Klemetti, Antti antti.klemetti at f-secure.com
Tue Dec 10 08:52:24 GMT 2013


Hi,

Our application subclasses QAbstractNativeEventFilter and
reimplements function QAbstractNativeEventFilter.nativeEventFilter
to catch application specific messages on Windows.
The Python version used is 3.3.2.

It seems that the PyQt implementation of QAbstractNativeEventFilter.nativeEventFilter
has a slightly modified function signature from that of Qt5 C++.
The Qt5 C++ function takes three parameters: eventType, message and result.
The PyQt version takes two parameters: eventType, message as input and
returns a tuple of bool and int, where int is the result.

The modified signature is not a problem, but there is some bug in the PyQt5 implementation.
If I return anything else than None as the result from my nativeEventFilter function,
PyQt5 implementation crashes.
If I return None, stderr gets the following error message:
"TypeError: invalid result type from WinEventFilter.nativeEventFilter()".

Here is our subclass implementation:
-----
    class WinEventFilter(QAbstractNativeEventFilter):
        def __init__(self, my_windows_message, log):
            QAbstractNativeEventFilter.__init__(self)
            self.my_windows_message = my_windows_message
            self.log = log

        def nativeEventFilter(self, eventType, message): # pylint: disable=W0613
            try:
                msg = ctypes.wintypes.MSG.from_address(message.__int__()) # pylint: disable=E1101
                if msg.message == self.my_windows_message:
                    # Handling for our special Windows message
                    pass
            except:
                self.log.exception("Exception in WinEventFilter.nativeEventFilter")
            dummy_result = None
            return False, dummy_result # False lets the event propagate freely
-----

BR, Antti


More information about the PyQt mailing list