Qt 进程通信QSharedMemory

来源:互联网 发布:网页翻译软件 编辑:程序博客网 时间:2024/06/05 11:29

学习了Qt中进程通信的一种QSharedMemory

一下是测试代码,运行两个即可,一个load一个push

dialog.h#ifndef DIALOG_H#define DIALOG_H#include <QDialog>#include <QSharedMemory>#include <QFileDialog>#include <QIODevice>#include <QDir>#include <QPixmap>#include <QBuffer>#include <QDataStream>#include <stdio.h>#include <stdlib.h>#include <QDebug>#include <QImage>namespace Ui {class Dialog;}class Dialog : public QDialog{    Q_OBJECTpublic:    explicit Dialog(QWidget *parent = 0);    ~Dialog();private slots:    void loadFromFileSlots();    void loadFromMemorySlots();private://    void detach();private:    Ui::Dialog *ui;    QSharedMemory *shareMemory;};#endif // DIALOG_Hdialog.cpp#include "dialog.h"#include "ui_dialog.h"Dialog::Dialog(QWidget *parent):     QDialog(parent),   ui(new Ui::Dialog){   ui->setupUi(this);   this->shareMemory = new QSharedMemory("shareMemoryExample");   this->setWindowTitle("sharedMemory Example");  connect(ui->loadImageButton,SIGNAL(clicked()),SLOT(loadFromFileSlots()));  connect(ui->pushMemoryButton,SIGNAL(clicked()),SLOT(loadFromMemorySlots()));}Dialog::~Dialog(){    delete ui;}void Dialog::loadFromFileSlots(){    if(shareMemory->isAttached())    {        if (!shareMemory->detach())               ui->label->setText(tr("Unable to detach from shared memory."));    }    ui->label->setText("Select a Image File!");    QString fileName = QFileDialog::getOpenFileName(0,"Open a Image file",QDir::currentPath(),("Image (*.png *.bmp *.jpg)"));    qDebug()<<fileName;    QImage image;    if(!image.load(fileName))    {        ui->label->setText("Select file is not an Image, please select another.");        return;    }   // ui->label->setPixmap(QPixmap::fromImage(image));    QBuffer buffer;    if(buffer.open(QIODevice::ReadWrite))    {        QDataStream in(&buffer);            in<<image;            int size = buffer.size();            if(!shareMemory->create(size))            {                ui->label->setText("Unable to creat shared memory!");                return;            }            shareMemory->lock();            char *to = (char *)shareMemory->data();            const char *from = buffer.data().data();            memcpy(to,from,qMin(shareMemory->size(),size));            shareMemory->unlock();    }}void Dialog::loadFromMemorySlots(){    if(!shareMemory->attach())    {        ui->label->setText("Unable to attach to shared memory segment.\n");        return;    }    QBuffer buffer;    QDataStream in(&buffer);    QImage image;    shareMemory->lock();    buffer.setData((char*)shareMemory->constData(),shareMemory->size());    buffer.open(QBuffer::ReadOnly);    in>>image;    shareMemory->unlock();    shareMemory->detach();    ui->label->setPixmap(QPixmap::fromImage(image));}main.cpp#include "dialog.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    Dialog w;    w.show();    return a.exec();}



0 0
原创粉丝点击