Qt中QByteArray类数组data,若执行write(data.constdata),测试发现会在数组中“0x00”值处出现断针,0x00值无法发送【已解决】

比如对于:

QByteArray  data;

data.resize(5);

data[0]=0x01;

data[1]=0x02;

data[2]=0x03;

data[3]=0x00;

data[4]=0x04;

1、选中write()函数,点击“F2”查找发现无论网口还是串口,调用的write()函数都源自QIODevice类,如下所示,省略其他;

 

class Q_CORE_EXPORT QIODevice
#ifndef QT_NO_QOBJECT
    : public QObject
#endif
{               

    qint64 write(const char *data, qint64 len);///<<<<--1
    qint64 write(const char *data);///<<<<--2
    inline qint64 write(const QByteArray &data)///<<<<--3
    { return write(data.constData(), data.size()); }

2、write()函数共有三个重载,若执行write(data)、write(data,5)、write(data.constdata,data.size())、或write(data.constdata,data.length())可正常发送,若执行write(data.constdata)则会在data[3]处出现断针,只将data[0]、data[1]、data[2]成功发送,尚未查到为何会出现这种现象。

 

鄙人愚见、请多指教。

 

要读取多个共享内存的图片,您可以按照以下步骤进行: 1. 使用QSharedMemory打开多个共享内存,分别对应0x7001,0x7002,0x7003,0x7004和0x7005。 2. 对于每一个共享内存,使用QBuffer将其内容读取到QByteArray。 3. 将QByteArray的数据转换成QPixmap,即可显示图片。 下面是示例代码: ```cpp #include <QApplication> #include <QSharedMemory> #include <QBuffer> #include <QPixmap> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 打开多个共享内存 QSharedMemory sharedMemory1("0x7001"); QSharedMemory sharedMemory2("0x7002"); QSharedMemory sharedMemory3("0x7003"); QSharedMemory sharedMemory4("0x7004"); QSharedMemory sharedMemory5("0x7005"); // 显示图片的标签 QLabel label; label.show(); // 读取共享内存的图片 while (true) { if (sharedMemory1.attach()) { QBuffer buffer; QByteArray byteArray; buffer.setBuffer(&byteArray); buffer.open(QIODevice::ReadWrite); buffer.write((const char*)sharedMemory1.constData(), sharedMemory1.size()); buffer.close(); sharedMemory1.detach(); QPixmap pixmap; pixmap.loadFromData(byteArray); label.setPixmap(pixmap); } if (sharedMemory2.attach()) { QBuffer buffer; QByteArray byteArray; buffer.setBuffer(&byteArray); buffer.open(QIODevice::ReadWrite); buffer.write((const char*)sharedMemory2.constData(), sharedMemory2.size()); buffer.close(); sharedMemory2.detach(); QPixmap pixmap; pixmap.loadFromData(byteArray); label.setPixmap(pixmap); } if (sharedMemory3.attach()) { QBuffer buffer; QByteArray byteArray; buffer.setBuffer(&byteArray); buffer.open(QIODevice::ReadWrite); buffer.write((const char*)sharedMemory3.constData(), sharedMemory3.size()); buffer.close(); sharedMemory3.detach(); QPixmap pixmap; pixmap.loadFromData(byteArray); label.setPixmap(pixmap); } if (sharedMemory4.attach()) { QBuffer buffer; QByteArray byteArray; buffer.setBuffer(&byteArray); buffer.open(QIODevice::ReadWrite); buffer.write((const char*)sharedMemory4.constData(), sharedMemory4.size()); buffer.close(); sharedMemory4.detach(); QPixmap pixmap; pixmap.loadFromData(byteArray); label.setPixmap(pixmap); } if (sharedMemory5.attach()) { QBuffer buffer; QByteArray byteArray; buffer.setBuffer(&byteArray); buffer.open(QIODevice::ReadWrite); buffer.write((const char*)sharedMemory5.constData(), sharedMemory5.size()); buffer.close(); sharedMemory5.detach(); QPixmap pixmap; pixmap.loadFromData(byteArray); label.setPixmap(pixmap); } } return a.exec(); } ``` 请注意,该示例代码只是一个简单的演示,实际应用需要根据实际情况进行更改和优化。同时,为了防止界面卡顿或者无响应,您可能需要使用多线程来处理共享内存的数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值