ZBLOG

qt如何把一个widget中绘制的符号写入共享内存,然后另一个程序读取这个共享内存数据,显示出图像

在 Qt 中,将一个 widget 中绘制的内容保存到共享内存中并让另一个程序读取这个数据以显示图像,可以按照以下步骤进行。我们将使用 QImageQSharedMemory 来实现。

步骤概述

  1. 在第一个程序中,从 widget 中获取绘制的内容,并将其写入共享内存。
  2. 在第二个程序中,从共享内存读取数据,并显示为图像。

示例代码

第一个程序:写入共享内存

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QSharedMemory>
#include <QImage>

class MyWidget : public QWidget {
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}

protected:
    void paintEvent(QPaintEvent *) override {
        QPainter painter(this);
        painter.setBrush(Qt::blue);
        painter.drawRect(10, 10, 100, 100);
        
        // 将当前绘制内容保存到 QImage
        QImage image(size(), QImage::Format_ARGB32);
        QPainter imagePainter(&image);
        imagePainter.fillRect(rect(), Qt::transparent); // 填充透明背景
        render(&imagePainter);

        // 写入共享内存
        writeToSharedMemory(image);
    }

private:
    void writeToSharedMemory(const QImage &image) {
        // 创建共享内存
        QSharedMemory sharedMemory("MySharedMemoryKey");
        
        if (!sharedMemory.create(image.sizeInBytes())) {
            qDebug() << "Unable to create shared memory:" << sharedMemory.errorString();
            return;
        }

        // 锁定共享内存
        sharedMemory.lock();

        // 将图像转换为 QByteArray 并拷贝到共享内存
        QByteArray byteArray;
        QBuffer buffer(&byteArray);
        buffer.open(QIODevice::WriteOnly);
        
        image.save(&buffer, "PNG"); // 使用 PNG 格式保存图像
        
        memcpy(sharedMemory.data(), byteArray.data(), byteArray.size());

         // 解锁共享内存
         sharedMemory.unlock();
     }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MyWidget w;
    w.resize(200, 200);
    w.show();

    return app.exec();
}

第二个程序:从共享内存读取并显示图像

#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QPixmap>
#include <QSharedMemory>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QLabel label;

    // 读取共享内存
    QSharedMemory sharedMemory("MySharedMemoryKey");

    if (sharedMemory.attach()) {
         // 锁定共享内存
         sharedMemory.lock();

         QByteArray byteArray(static_cast<const char*>(sharedMemory.constData()), 
                              sharedMemory.size());
         
         sharedMemory.unlock();

         // 从 QByteArray 创建图像 
         QImage image;
         image.loadFromData(byteArray, "PNG");

         label.setPixmap(QPixmap::fromImage(image));
     } else {
         qDebug() << "Unable to attach to shared memory:" << sharedMemory.errorString();
     }

     label.show();
     return app.exec();
}

解释代码:

  1. 第一个程序

    • 创建了一个自定义的 MyWidget 类,重载了 paintEvent() 方法,在其中绘制了一个蓝色矩形。
    • 将 widget 的内容渲染到 QImage 对象上。
    • 使用 QSharedMemory 将该图像数据写入到共享内存。
  2. 第二个程序

    • 尝试附加到同样的共享内存块。
    • 从共享内存读取字节数组,然后将其加载为 QImage,最后通过 QLabel 显示出来。

注意事项:

  • 确保两个应用程序都使用相同的关键字 "MySharedMemoryKey"
  • 如果需要同时更新和读取,请考虑适当的同步机制(例如使用互斥量)来防止竞态条件。
  • 在不同平台上,共享内存在创建和管理方面可能会有不同,因此在实际应用中应根据操作系统要求进行调整。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20525

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?