1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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
|