aboutsummaryrefslogtreecommitdiffstats
path: root/examples/corelib/ipc/sharedmemory/dialog.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/corelib/ipc/sharedmemory/dialog.py')
-rw-r--r--examples/corelib/ipc/sharedmemory/dialog.py93
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