9

If I have a

signal:
    void foo(QByteArray data);

And in QML I handle it:

 onFoo: {
     console.log(data.toString());
 }

What is the type of data in QML? What methods does it have? It doesn't seem to be a javascript string - it doesn't even have a .length, and no .charCodeAt(). But it also doesn't seem to be a QByteArray - no .at(). data[0] is undefined! It does have .toString().

How do I access its contents? E.g. if it is a four-byte uint32_t, how do I get that number into a javascript variable?

Timmmm
  • 88,195
  • 71
  • 364
  • 509
  • 1
    There seems to be some development in getting QByteArray to ArrayBuffer conversion. Since it was merged just a few days ago we probably have to wait until Qt 5.8. https://codereview.qt-project.org/#/c/144761/ – pwuertz Apr 17 '16 at 22:33

2 Answers2

8

As stated in here :

The QML engine provides automatic type conversion between QByteArray values and JavaScript ArrayBuffer objects.

This feature is available since Qt 5.8.

Nejat
  • 31,784
  • 12
  • 106
  • 138
4

According to http://doc.qt.io/qt-5/qtqml-cppintegration-data.html and the current source http://code.woboq.org/qt5/qtdeclarative/src/qml/compiler/qqmltypecompiler.cpp.html#567, there's no conversion between QByteArray towards QML. You'll probably get an opaque, unaccesible Object in JS.

EDIT: The above was true up to Qt 5.8. 5.8 added a conversion between QByteArray and JS Array, see the other answer.

Needless to say: at the time of this writing, the only version you want to be using is >= 5.12.

peppe
  • 21,934
  • 4
  • 55
  • 70