将二进制数据从QML传递到C
Pass binary data from QML to C++
我在qml内部的javascript中有一个'binary String',代表我想传递给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(),' ');
for (int i=0; i<data.length(); i++) bytes[i] = data[i].toInt();
m_tcpSocket->write(bytes);
}
}
将ByteBuffer
或二进制字符串从QML/JavaScript传递到QT/C 的有效方法是什么,它可以给我一些我可以写入QTcpSocket
的东西?
qt 5.7不了解从C 到QML的QByTearray,因此它将其包装到不透明的QVariant中,使其在QML中毫无用处,除了以后的时间将其传递回C 。
QT 5.8 增加了对QbyTearray类型的支持。当从C 传递到QML时,作为返回变量或信号参数,QByTearray将转换为阵列延迟。这对于Protobufs很有用,因为Protobuf的JavaScript API可以直接解码ArrayBuffer类型。
// QML
onSomeSignal: {
var bytes = new MyMessage();
messageBridge.send(bytes.toArrayBuffer());
}
和数组缓冲区将非常适合QByTearray:
// C++
void MessageBridge::send(const QByteBuffer& data) {
if (m_tcpSocket->state() == QAbstractSocket::ConnectedState) {
m_tcpSocket->write(encodeVarint32(data.size()).toLocal8Bit());
m_tcpSocket->write(data);
}
现在,请告诉我如何从C 中的QByTeBuffer转到QML信号中的有用Protobuf.js对象:)
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 从C++实例化QML
- 使用CMake创建QML插件
- 有根的二进制搜索树.保留与其父级的链接
- 多态二进制函数
- QT通过C++添加映射QML项目
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- 如何在没有信号的情况下从C++执行QML插槽
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为什么二进制搜索在我的测试中不起作用
- 重载==不适用于二进制树
- QML按钮点击功能执行顺序
- 正在尝试重载二进制搜索树分配运算符
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 将二进制数据从QML传递到C
- 外部二进制资源已打开,但QML中不存在