OK, that's interesting, I wan't ware about all those behavior difference between QT5/6 and SIP versions.
> So if building QGIS Qt5, but with SIP6 available, I expect the result > will be proper enum.Enums. But I have not tried. That's my test configuration and it doesn't work. It seems we need both Qt6 and SIP 6. Regards, Julien > After getting some help from Nyall, I have boiled it down to the following: > > SIP 4/5: translates C++ enum into regular Python classes inheriting from > 'int'. And furthermore, because of the way SIP works, __dir__ does not > reveal the members. > > SIP 6: translates C++ enums into enum.Enum, which works properly with > __iter__ and __members__ (and maybe __dir__ too). > > Qt6 depends on SIP 6, so any version of QGIS built with Qt6 will end up > having proper enum.Enum objects. > > When building QGIS, it will first attempt to use SIP 6, but if not available > it will fall back to SIP 4/5. This happens in FindSIP.py. So if building QGIS > Qt5, but with SIP6 available, I expect the result will be proper enum.Enums. > But I have not tried. > > On Wed, Jul 2, 2025 at 2:19 PM Julien Cabieces <julien.cabie...@oslandia.com> > wrote: > > You're right, the actual code doesn't work in my environment either. > > PyQt is also a wrapper of Qt made with sip, so we should get the same > result in sip. > > QCborSimpleType is actually and exception because it fails also with > other Qt enums that I have tested (Qt.ItemDataRole for instance). > > I don't get what happen here, the script supposedly not work like it > should. But it worked before, so I'm wondering what happened. Maybe SIP > changed things and introduced the mappingproxy thing. > > I'd have to investigate a bit... > > If anyone has information on this, please share :) > > Regards, > Julien > > > Thanks. And that function works well for e.g. > qgis.qgis.PyQt.Qt.QCborSimpleType. Which by the way has type > > enum.EnumType, and is defined in QGIS/share/qgis/python/qgis/PyQt/Qt.py. > > > > But Im talking about an "enum" created by SIP. Such an "enum" is a class > definition, with 'int' as its only parent class. It > > has around 14 enum-members, e.g. "Symbology". But there is no way of > getting a complete list of them. Neither with _ > > _dict__ nor dir. > > > >>>> from qgis.core import QgsMapLayer > >>>> QgsMapLayer.StyleCategory > > <class 'qgis._core.QgsMapLayer.StyleCategory'> > >>>> type(QgsMapLayer.StyleCategory) > > <class 'sip.enumtype'> > >>>> QgsMapLayer.StyleCategory.__dict__ > > mappingproxy({'__module__': 'qgis._core', '__or__': <slot wrapper '__or__' > of 'StyleCategory' objects>, '__ror__': <slot > > wrapper '__ror__' of 'StyleCategory' objects>, '__dict__': <attribute > '__dict__' of 'StyleCategory' objects>, '__doc__': None, > > '__reduce__': <method '_pickle_enum' of 'StyleCategory' objects>, > 'baseClass': <class 'qgis._core.QgsMapLayer'>}) > >>>> dir(QgsMapLayer.StyleCategory) > > ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', > '__delattr__', '__dict__', '__dir__', '__divmod__', '__doc__', > > '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', > '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', > > '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', > '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', > > '__module__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', > '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', > > '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', > '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', > > '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', > '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', > > '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'baseClass', > 'bit_count', 'bit_length', 'conjugate', 'denominator', > > 'from_bytes', 'imag', 'is_integer', 'numerator', 'real', 'to_bytes'] > >>>> QgsMapLayer.StyleCategory.Symbology # but the members are there ! > > 2 > > > > On Wed, Jul 2, 2025 at 10:00 AM Julien Cabieces > <julien.cabie...@oslandia.com> wrote: > > > > Hi, > > > > If you want an example, it has been done here: > > > https://github.com/qgis/QGIS/blob/cb48529abf5bd81e3c97d09809e3d56e51c943bd/scripts/pyqt5_to_pyqt6/pyqt5_to_pyqt6.py#L796 > > > > > > You have to use __dict__. But I'm not sure this is a good thing to use > > this in a plugin. The script I mention is an helper for migration from > > qt5 to qt6, so it's kind of special. > > > > Regards, > > Julien > > > > > Happy summer to all of you :) > > > > > > It seems in the Python bindings produced by SIP, a C++ enum is just a > Python class with a certain structure. And > > with little/none possibility of > > > introspection. > > > > > > But how can I get a list with all enum-members (e.g. Symbology, Fields) > of that enum? > > > > > > dir(QgsMapLayer.StyleCategory) does not list them, and > QgsMapLayer.StyleCategory.__members__ is undefined. > > > > > > Do I really have to hard code the member names into my plugin, if I > want to iterate over all of them? > > > > > > Sincerely, Thomas > > > > > > _______________________________________________ > > > QGIS-Developer mailing list > > > QGIS-Developer@lists.osgeo.org > > > List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer > > > Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer > > > > -- > > > > Julien Cabieces > > Senior Developer at Oslandia > > julien.cabie...@oslandia.com > > -- > > Julien Cabieces > Senior Developer at Oslandia > julien.cabie...@oslandia.com -- Julien Cabieces Senior Developer at Oslandia julien.cabie...@oslandia.com _______________________________________________ QGIS-Developer mailing list QGIS-Developer@lists.osgeo.org List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer