[Development] Changed enum property behaviour in Qt v6.8

Phil Thompson phil at riverbankcomputing.com
Fri Oct 4 14:43:38 CEST 2024


Hi Fabian,

The change was https://codereview.qt-project.org/c/qt/qtbase/+/559265

Reverting this change means I get the same behaviour as I get with v6.7.

I am (and always have been) using QMetaObjectBuilder and addEnumerator() 
(the overload that takes a QByteArray argument).

I've compared the following scenarios...

a moc-generated meta-object where Q_ENUM is not used
a moc-generated meta-object where Q_ENUM is used
a dynamically created meta-object.

...for v6.7.1, v6.8.0 and v6.8.0 with the change reverted. In each case 
I looked at the results of...

QMetaEnum.metaType().isValid()
QMetaProperty.metaType().isValid()
QMetaProperty.isEnumType()

The results in all cases for v6.7.1 and v6.8.0 with the change reverted 
were identical.

For moc-generated meta-objects...

- the results were consistent across all versions of Qt
- QMetaProperty.metaType().isValid() always returned true (even if 
QMetaEnum.metaType().isValid() returned false)
- QMetaProperty.isEnumType() returned true if Q_ENUM was used and false 
if it wasn't

For dynamically created meta-objects...

- the results were dependent on the version of Qt
- QMetaProperty.metaType().isValid() always returned false
- QMetaProperty.isEnumType() returned true for v6.7.1 and false for 
v6.8.0

I was surprised by the result of QMetaProperty.isEnumType() for a 
moc-generated meta-object without Q_ENUM. The docs suggest this should 
be true for all enums whether or not Q_ENUM is used.

This actually means that the v6.8 dynamic behaviour is closer to the 
moc-generated behaviour but means it seems to be impossible to 
dynamically create an enum property where QMetaProperty.isEnumType() 
returns true.

Some questions...

Why does QMetaProperty.metaType().isValid() always return true for 
moc-generated meta-objects and false for dynamically created 
meta-objects?

Is there any way to dynamically register an enum with the meta-type 
system (so that QMetaEnum.metaType().isValid() returns true)?

Regards,
Phil

On 04/10/2024 08:02, Fabian Kosmale via Development wrote:
> Hi Phil,
> 
> I'm not quite sure which change caused the issue, and I believe a
> bugreport with a reproducer might shed some light on the issue.
> 
> Nevertheless, if you're already using the private QMetaObjectBuilder
> API, I would expect that it should work if you build the enum also
> dynamically via addEnumerator and then working with the returned
> QMetaEnumBuilder.
> 
> Kind regards,
> Fabian
> 
> On 03.10.24 17:52, Phil Thompson via Development wrote:
>> On 03/10/2024 16:31, Volker Hilsheimer wrote:
>>>> On 3 Oct 2024, at 17:07, Phil Thompson via Development 
>>>> <development at qt-project.org> wrote:
>>>> 
>>>> On 03/10/2024 15:44, Thiago Macieira wrote:
>>>>> On Thursday 3 October 2024 05:06:08 GMT-7 Phil Thompson via 
>>>>> Development wrote:
>>>>>> Yes, that's the change - commenting out the new test fixes the 
>>>>>> problem.
>>>>>> I am dynamically building the meta-object. You don't really build 
>>>>>> an
>>>>>> enum, you just provide a description of it to the meta-object. It 
>>>>>> would
>>>>>> be nice to be able to register an enum with the meta-type system
>>>>>> dynamically.
>>>>> Or you can set the EnumOrFlag flag in the QMetaProperty flags field 
>>>>> to
>>>>> force the
>>>>> constructor to search.
>>>> 
>>>> Sorry, can you be more specific? I can't see how to do it given the 
>>>> private nature of the flags.
>>>> 
>>>> Phil
>>> 
>>> 
>>> Hey Phil,
>>> 
>>> How do you generate a dynamic meta object without using private APIs?
>>> Do you use QMetaObjectBuilder (which is private), or do you generate
>>> the tables and arrays by hand?
>>> 
>>> If you use QMetaObjectBuilder, then
>>> QMetaPropertyBuilder::setEnumOrFlag would be the way to go.
>>> 
>>> Volker
>> 
>> I'm using QMetaObjectBuilder and already calling setEnumOrFlag, so 
>> that doesn't seem to solve the problem.
>> 
>> An alternative that would work for me would be to bypass the new test 
>> if the meta-type was invalid (ie. the enum wasn't registered) but I 
>> don't know if that would nullify the purpose of the new test.
>> 
>> Phil
> 
> --
> Fabian Kosmale
> Manager R&D
> 
> The Qt Company GmbH
> Erich-Thilo-Str. 10
> D-12489 Berlin
> fabian.kosmale at qt.io
> +49 1638686070


More information about the Development mailing list