I have an interface which gives me a QVariant
of an arbitrary type. I need to convert the data content in this variant to a raw binary QByteArray
:
QVariant result = myQVariantReturningMethod(type arg, type arg2);
QByteArray rawResult = ?;
The resulting QByteArray
is sent over Canbus. Depending on its size, it is transmitted in several can frames or in a single one. The can bus interface for sending frames takes a QByteArray
as input. Based on additional information, the receiver of the can frames knows how to parse the incoming stream of can frames.
I tried several approaches
QDataStream
to get the data into the array. However the serialization works in an unpredictable way, where I always get additional information about the type itself in the resulting array, depending of the implementation of the <</>>
operators for the type.toString().toStdString()
of the QVariant
, resulting in a casted value, not the actual binary raw data which is not what I want.toBytearryay()
, resulting in the same.I do not care whether an stl
way or a qt
way is a possible approach to the problem. However, It has to be c++11
-compatible
It turns out, that QVariant
has an undocumented method constData()
which gives exactly the result I want to have: A pointer to the internally stored data of the QVariant
. Together with QMetaType::sizeOf()
, this is exactly what is needed to write all the data into a QByteArray
.
I found that method documented in the documentation of Qt 6.0
and found it as well working with my Qt 5.12.7
, despite not being described in the corresponding documentation.