diff options
Diffstat (limited to 'examples/corelib/ipc/sharedmemory/dialog.py')
-rw-r--r-- | examples/corelib/ipc/sharedmemory/dialog.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/examples/corelib/ipc/sharedmemory/dialog.py b/examples/corelib/ipc/sharedmemory/dialog.py new file mode 100644 index 000000000..134900047 --- /dev/null +++ b/examples/corelib/ipc/sharedmemory/dialog.py @@ -0,0 +1,93 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import os +from pathlib import Path + +from PySide6.QtWidgets import QFileDialog, QDialog +from PySide6.QtCore import QBuffer, QIODeviceBase, Slot, QSharedMemory, QDataStream, qVersion +from PySide6.QtGui import QImage, QPixmap +from ui_dialog import Ui_Dialog + + +class Dialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + + v = qVersion() + name = f"QSharedMemoryExample_v{v}" + self._shared_memory = QSharedMemory(name) + + self.ui = Ui_Dialog() + self.ui.setupUi(self) + self.ui.loadFromFileButton.clicked.connect(self.load_from_file) + self.ui.loadFromSharedMemoryButton.clicked.connect(self.load_from_memory) + self.setWindowTitle("SharedMemory Example") + + def ensure_detached(self): + if self._shared_memory.isAttached(): + self.detach() + + def closeEvent(self, e): + self.ensure_detached() + e.accept() + + @Slot() + def load_from_file(self): + self.ensure_detached() + + self.ui.label.setText("Select an image file") + dir = Path(__file__).resolve().parent + fileName, _ = QFileDialog.getOpenFileName(self, "Choose Image", + os.fspath(dir), + "Images (*.png *.jpg)") + if not fileName: + return + image = QImage() + if not image.load(fileName): + self.ui.label.setText("Selected file is not an image, please select another.") + return + self.ui.label.setPixmap(QPixmap.fromImage(image)) + + # load into shared memory + buffer = QBuffer() + buffer.open(QIODeviceBase.WriteOnly) + out = QDataStream(buffer) + out << image + buffer.close() + size = buffer.size() + + if not self._shared_memory.create(size): + self.ui.label.setText("Unable to create shared memory segment.") + return + + self._shared_memory.lock() + _to = memoryview(self._shared_memory.data()) + _from = buffer.data().data() + _to[0:size] = _from[0:size] + self._shared_memory.unlock() + + @Slot() + def load_from_memory(self): + if not self._shared_memory.isAttached() and not self._shared_memory.attach(): + self.ui.label.setText("Unable to attach to shared memory segment.\n" + "Load an image first.") + return + + self._shared_memory.lock() + mv = memoryview(self._shared_memory.constData()) + buffer = QBuffer() + buffer.setData(mv.tobytes()) + buffer.open(QBuffer.ReadOnly) + _in = QDataStream(buffer) + image = QImage() + _in >> image + buffer.close() + self._shared_memory.unlock() + self._shared_memory.detach() + + self.ui.label.setPixmap(QPixmap.fromImage(image)) + + def detach(self): + if not self._shared_memory.detach(): + self.ui.label.setText(self.tr("Unable to detach from shared memory.")) # noqa: F821 |