Кажется, что что-то идет не так, когда значения указателей выходят за пределы 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.