ZBLOG

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

在 Qt 中将子窗口中绘制的内容写入共享内存,然后让另一个程序读取并显示这些内容,涉及到以下几个步骤:

  1. 创建一个自定义的子窗口,并在其上进行绘图
  2. 将绘图内容保存为位图(例如 QImageQPixmap
  3. 使用 QSharedMemory 将位图数据写入共享内存
  4. 另一个程序从共享内存读取数据,并显示为图像

示例代码

1. 创建自定义子窗口并绘制符号

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

class MySubWindow : public QWidget {
    Q_OBJECT
public:
    MySubWindow(QWidget *parent = nullptr) : QWidget(parent) {
        setFixedSize(200, 200); // 设置子窗口大小
    }

protected:
    void paintEvent(QPaintEvent *) override {
        QPainter painter(this);
        painter.setBrush(Qt::blue);
        painter.drawEllipse(10, 10, 100, 100); // 绘制蓝色圆形
        
        // 保存为位图
        QImage image(size(), QImage::Format_ARGB32);
        QPainter imgPainter(&image);
        imgPainter.fillRect(image.rect(), Qt::white); // 填充背景
        imgPainter.setRenderHint(QPainter::Antialiasing);
        
        imgPainter.drawEllipse(10, 10, 100, 100);

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

private:
    void writeToSharedMemory(const QImage &image) {
        QSharedMemory sharedMemory("MySharedMemory");
        
        if (!sharedMemory.create(image.byteCount())) {
            qWarning("Unable to create shared memory.");
            return;
        }
        
        char *to = (char*)sharedMemory.data();
        const uchar *from = image.bits();

        memcpy(to, from, image.byteCount()); // 拷贝数据到共享内存
    }
};

2. 从共享内存读取数据并显示图像

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

class ImageDisplay : public QLabel {
public:
    ImageDisplay(QWidget *parent = nullptr) : QLabel(parent) {
       setFixedSize(200, 200); // 设置显示标签大小
       readFromSharedMemory(); 
    }

private:
    void readFromSharedMemory() {
        QSharedMemory sharedMemory("MySharedMemory");

        if (!sharedMemory.attach()) { 
            qWarning("Unable to attach to shared memory.");
            return;
         }

         const uchar *data = reinterpret_cast<const uchar*>(sharedMemory.data());
         // 假设我们知道图片宽高和格式,这里以200x200为例。
         QImage image(data, width(), height(), QImage::Format_ARGB32);
         
         setPixmap(QPixmap::fromImage(image));
         resize(image.size());
     }
};

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

    MySubWindow subWindow;
    subWindow.show();

    ImageDisplay display;
    display.show();

    return a.exec();
}

注意事项

  • 共享内存标识符:确保两个应用程序使用相同的共享内存名称(如 “MySharedMemory”)。
  • 固定尺寸:在这个示例中,假设我们知道要绘制的图像尺寸。根据实际需要,可以调整和扩展代码来动态处理不同大小的图像。
  • 同步问题:多个进程同时访问共享内存可能导致竞态条件。在实际应用中,你可能需要使用互斥量等机制进行同步处理,以避免读写冲突。
  • 错误处理:应该在生产代码中添加更详尽的错误检查和处理逻辑。

通过以上步骤,你可以实现从一个 Qt 子窗口向另一个程序传递绘制的内容并进行显示。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?