/tmp/snapshot-pyside-6.2-rel/pyside-setup/examples/corelib/ipc/sharedmemory¶
(You can also check this code in the repository)
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(tr("Unable to detach from shared memory."))
<ui version="4.0" >
<class>Dialog</class>
<widget class="QDialog" name="Dialog" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>451</width>
<height>322</height>
</rect>
</property>
<property name="windowTitle" >
<string>Dialog</string>
</property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QPushButton" name="loadFromFileButton" >
<property name="text" >
<string>Load Image From File...</string>
</property>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="label" >
<property name="text" >
<string>Launch two of these dialogs. In the first, press the top button and load an image from a file. In the second, press the bottom button and display the loaded image from shared memory.</string>
</property>
<property name="alignment" >
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0" >
<widget class="QPushButton" name="loadFromSharedMemoryButton" >
<property name="text" >
<string>Display Image From Shared Memory</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
"""PySide6 port of the ipc/sharedmemory example from Qt v6.x"""
import sys
from PySide6.QtWidgets import QApplication
from dialog import Dialog
if __name__ == "__main__":
application = QApplication()
dialog = Dialog()
dialog.show()
sys.exit(application.exec())
© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.