Обернутые в QVariant указатели становятся пустыми в QML - PullRequest
1 голос
/ 16 мая 2019

Кажется, что что-то идет не так, когда значения указателей выходят за пределы C ++ и QML. Я использую простые старые fromValue() и value() для преобразования в void * и обратно, и он работает, как и ожидалось, до тех пор, пока вариант остается на стороне C ++.

В тот момент, когда он возвращается в QML, он теперь разрешается в null, а при передаче обратно в C ++ тип варианта изменяется с void * на std::nullptr_t и значение равно нулю.

returning 0x3ba5b10 // created
converting to qvariant 0x3ba5b10 // converting
converted QVariant(void*, 0x3ba5b10) 0x3ba5b10 // now variant, testing value() - all good
qml: null // in qml
received QVariant(std::nullptr_t, (nullptr)) 0x0 // back in c++

Я использую:

Q_DECLARE_METATYPE(void*)
qRegisterMetaType<void*>();

Есть какие-нибудь подсказки относительно того, что здесь происходит?

Редактировать: это еще более странно, я заставляю его работать, приводя значения указателя к 64-битному uint и обратно, но при переходе на QML информация о типе портится, в C ++ вариант имеет тип qulonglong, возвращаясь из QML, теперь это double, поэтому есть подозрение, что он может что-то округлить и испортить значение указателя.

Редактировать 2: обратите внимание, что вопрос не в том, чтобы рекомендовать практики, а в том, почему это не работает так, как ожидалось и наблюдалось до достижения QML.

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Вам не нужно регистрироваться void*, скорее используйте метатип QMetaType :: VoidStar .

Обратите внимание, что для регистрации метатипа SomeCustomType* вам необходимо использоватьпсевдоним.

using SomeCustomTypePtr = SomeCustomType*;
Q_DECLARE_METATYPE(SomeCustomTypePtr)
qRegisterMetaType<SomeCustomTypePtr>();
1 голос
/ 16 мая 2019

Разве невозможно сделать такие заявления?

Согласно официальной документации на Q_DECLARE_METATYPE (Тип) :

Этот макрос делает тип Type известным QMetaType, пока он предоставляет открытый конструктор по умолчанию, открытый конструктор копирования и открытый деструктор. Необходимо использовать тип Type как пользовательский тип в QVariant.

Этот макрос требует, чтобы Type был полностью определенным типом в том месте, где он используется.

Звучит странно, что это работает по крайней мере в части C ++.

Не думаете ли вы, что будет лучшим и простым решением объявить указатель вашего типа вместо void*?

...