qt 共享内存

这里读取图片通过共享内存在另一个窗口显示:

//.h声明对象
  QImage srcImage
  QImage dstImage; //操作对象
  QSharedMemory sharedMemory; //共享内存对象
  QSharedMemory sharedMemory1; //共享内存对象

//.cpp
读取图片并储存到srcImage:
QString filename;
    filename = QFileDialog::getOpenFileName(this,
                                              QString::fromLocal8Bit("选择图像"),
                                              "",
                                              tr("Images (*.png *.bmp *.jpg *.tif *.GIF )"));
srcImage.load(filename)

//读取界面设置的KEY值
QString qstrKey = ui->key_lineEdit->text();
//共享内存设置key值
sharedMemory.setKey(qstrKey);

  //将图片缓存到QBuffer中
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out( &buffer );
    out<<srcImage;
    int size = buffer.size();

sharedMemory.create(size)//创建指定大小内存

//图片写入共享内存
 sharedMemory.lock();
    char *to = (char *) sharedMemory.data();
    const char *from = buffer.data().data();
    memcpy(to, from, qMin(sharedMemory.size(), size));//to是目标地址  from要复制的源地址即把from的复制到to,  qMin这里是指定最小空间(实际上是不让复制越界)
    sharedMemory.unlock();

//从共享内存读出文件并显示
 QString qstrKey = ui->key_lineEdit->text(); //获得KEY值  读共享内存的key一定要和写入key相同
 sharedMemory1.setKey(qstrKey);

//先让sharedMemory1对象attch()到共享内存
    sharedMemory1.attach();

// isAttached 检查sharedMemory是否连接到共享内存
    if(sharedMemory.isAttached()==false)//  该行可保证单个程序自身可写可读
    {
        if (sharedMemory.attach(QSharedMemory::ReadOnly)==false)
         {
            //没有连接到共享内存;
            return;
         }
 //取出共享内存
    QBuffer buffer;
    QDataStream in(&buffer);

    sharedMemory1.lock();
    buffer.setData((char *)sharedMemory1.constData(), sharedMemory1.size());
    buffer.open( QBuffer::ReadOnly);
    in >> dstImage;
    sharedMemory1.unlock();

    sharedMemory1.detach(); //该行断掉了本进程与共享内存的联系。
    //显示读取图
    ui->dst_label->setPixmap(QPixmap::fromImage(dstImage).scaledToHeight(ui->src_frame->height()));









效果: 左边是加载图,右边从共享内存读取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值