PyQt6: QEvent.type() returns int instead of QEvent.Type

Phil Thompson phil at riverbankcomputing.com
Tue Apr 26 09:19:05 BST 2022


On 21/04/2022 10:37, Florian Bruhin wrote:
> Hey,
> 
> With PyQt5:
> 
>     >>> evtype = QEvent(QEvent.Type.User).type()
>     >>> evtype
>     1000
>     >>> type(evtype)
>     <class 'PyQt5.QtCore.QEvent.Type'>
> 
> and even:
> 
>     >>> evtype = QEvent(QEvent.Type.User + 1).type()
>     >>> evtype
>     1001
>     >>> type(evtype)
>     <class 'PyQt5.QtCore.QEvent.Type'>
> 
> but with PyQt6, the type information gets lost:
> 
>     >>> evtype = QEvent(QEvent.Type.User).type()
>     >>> evtype
>     1000
>     >>> type(evtype)
>     <class 'int'>
> 
> From what I understand, it's not possible to convert arbitrary values
> into an IntEnum:
> 
>     >>> QEvent.Type(QEvent.Type.User + 1)
>     [...]
>     ValueError: 1001 is not a valid QEvent.Type
> 
> But least for types which are part of QEvent.Type, calling .type()
> should perhaps return the IntEnum value again instead of falling back 
> to
> an int without any type information? Given that IntEnum is an int
> subclass, this should be a backwards-compatible change too.

I've been adopting a piecemeal approach to this sort of thing so far. 
For example having QEvent.type() return an int and adding an extra 
QEvent ctor that accepts an int, and similar with gesture types. However 
the issue you point out in your other email (new enum members in later 
versions of Qt) is something I hadn't considered.

I think the solution is to take the approach you suggest above and apply 
it to all enums (no matter what their base type is). In other words, 
when converting from Python to a C++ enum both a Python enum and an int 
will be accepted. When converting from a C++ enum to Python then the 
corresponding enum member will be returned or an int if there is no such 
member.

This would mean that there is no need for me to apply special treatment 
to individual methods (as the change is implemented in the sip module) 
and the approach should be future-proof.

Thoughts?

Phil


More information about the PyQt mailing list