这里读取图片通过共享内存在另一个窗口显示:
//.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()));
效果: 左边是加载图,右边从共享内存读取