c++ - 将二进制数据从 QML 传递到 C++

标签 c++ qt qml qtquick2

我在 QML 中的 JavaScript 中有一个“二进制字符串”,表示我想传递给 C++ 的原始字节(通过已建立的套接字发送)。

我使用的代码是这样的:

// QML
onSomeSignal: {
  var proto = new MyMessage();  // https://github.com/dcodeIO/protobuf.js
  var bbuf  = proto.encode();   // https://github.com/dcodeIO/bytebuffer.js
  var bytes = bbuf.toBinary();
  messageBridge.send(bytes);
}
// C++
void MessageBridge::send(const QString& data) {
    if(m_tcpSocket->state() == QAbstractSocket::ConnectedState) {
        m_tcpSocket->write(encodeVarint32(data.length()).toLocal8Bit());
        m_tcpSocket->write(data.toLocal8Bit());
    }
}

但是,我发现将 JavaScript 字符串转换为 QString 有时会更改字节(可能是因为编码)。

以下代码有效,但效率低下,将字节缓冲区转换为二进制字符串,然后是 JS 数组,转换为 QVariantList,然后零碎地填充 QByteArray。

// QML
onSomeSignal: {
  var bytes = (new MyMessage()).encode().toBinary();
  var bytea = [];
  for (var i=bytes.length;i--;) bytea[i] = bytes.charCodeAt(i);
  messageBridge.send(bytes);
}
// C++
void MessageBridge::send(const QVariantList& data) {
    if(m_tcpSocket->state() == QAbstractSocket::ConnectedState) {
        m_tcpSocket->write(encodeVarint32(data.length()).toLocal8Bit());
        m_tcpSocket->write(data.toLocal8Bit());
        QByteArray bytes(data.length(),'\0');
        for (int i=0; i<data.length(); i++) bytes[i] = data[i].toInt();
        m_tcpSocket->write(bytes);
    }
}

传递 ByteBuffer 的有效方法是什么?或从 QML/JavaScript 到 Qt/C++ 的二进制字符串,以某种方式提供我可以提供的东西 write to a QTcpSocket

最佳答案

Qt 5.7 不理解从 C++ 到 QML 的 QByteArray,所以它只是将它包装到一个不透明的 QVariant 中,使其在 QML 中无用,除了稍后将它传回 C++。

Qt 5.8+ 添加了对 QByteArray 类型的支持。当从 C++ 传递到 QML 时,作为返回变量或信号参数,QByteArray 被转换为 ArrayBuffer。这对 protobufs 很有用,因为 protobuf 的 javascript API 可以直接解码 ArrayBuffer 类型。

关于c++ - 将二进制数据从 QML 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40940199/

相关文章:

c++ - 我怎么知道boost线程是否完成?

java - 将 Java 转换为 C++ : Templates vs. 泛型

c++ - static_cast 的奇怪用法

c++ - 有哪些具有快速附加和随机访问功能的可移植数据后端?

c++ - Cairo 和 Qt 集成

java相当于atof C++

c++ - QSqlDatabase断线检测

qt - 将文件从应用程序拖到资源管理器。我的应用程序可以复制吗?

QML TextArea 不会滚动

qt - QML ListView : How to disable autoscrolling when new elements inserted?