Qt进程间通信

Qt

共享内存QShareBuffer

以共享一个图片为例

头文件添加QShareMemory memory;

图片加载到共享内存

先申请一个缓冲区,将图片加载到缓冲区,利用memcpy将缓冲区的内容copy到共享内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void MainWindow::addimageSlot()
{
if(memory.isAttached())
{
memory.detach();//如有共享内存则删除,将共享内存与程序分离
}
QString openFileName = QFileDialog::getOpenFileName(this,"打开文件",QDir::currentPath(),"文件(*.jpg *.png *.bmp)");
QImage image;
if (!image.load(openFileName))
{
ui->imageLabel->setText("Selected file is not an image, please select another.");
return;
}
ui->imageLabel->setPixmap(QPixmap::fromImage(image));//QPixmap与QImage见下
//先申请一个缓冲区,将图片加载到缓冲区,利用memcpy将缓冲区的内容copy到共享内存
//中间注意size
//将图片加入到一块缓冲区
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);//设置读写属性
QDataStream out(&buffer);//设置数据流,指向buffer
out<<image;//将图片通过文件流存入buffer
//判断
int size = buffer.size();
if (!memory.create(size))
{
ui->imageLabel->setText("不能创造共享内存!");
// qDebug()<<memory.errorString();
return ;
}
//从缓冲区到共享内存
memory.lock();
char *to = (char*)memory.data();//返回一个共享内存内容的指针
const char *from = buffer.data().data();
memcpy(to,from,qMin(memory.size(),size));
memory.unlock();
}

从共享内存读取图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void MainWindow::getMemorySlot()
{
//判断共享内存是否存在
if(!memory.attach())
{
ui->imageLabel->setText("无共享内存,请先加载一个图片");
return;
}
QBuffer buffer;
QDataStream in(&buffer);
QImage image;
memory.lock();
buffer.setData((char*)memory.constData(),memory.size());//
buffer.open(QBuffer::ReadOnly);
in>>image;
memory.unlock();
memory.detach();//分离,删除
ui->imageLabel->setPixmap(QPixmap::fromImage(image));
}

剪贴板QClipboard

剪贴板也算一种进程通信的方式

1
2
QClipboard *clipboard = QApplication::clipboard();
clipboard->setPixmap(this->Pixmap);//把图片加到剪贴板
1
2
3
QClipboard *preclipboard = QApplication::clipboard();
QSize pixmapSize = preclipboard->pixmap().size()*0.8;//将图片原尺寸8/10缩放
ui->previewLabel->setPixmap(preclipboard->pixmap().scaled(pixmapSize));

QPixmap与QImage

QPixmap依赖于硬件,QImage不依赖于硬件。
QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的。

当图片小的情况下,直接用QPixmap进行加载,画图时无所谓,
当图片大的时候如果直接用QPixmap进行加载,会占很大的内存,一般一张几十K的图片,用QPixmap加载进来会放大很多倍,
所以一般图片大的情况下,用QImage进行加载,然后转乘QPixmap用户绘制。QPixmap绘制效果是最好的。

同时QPimap主要用于加速显示,QImag主要是图像处理

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器