aboutsummaryrefslogtreecommitdiffstats
path: root/examples/corelib
diff options
context:
space:
mode:
authorCristian Maureira-Fredes <Cristian.Maureira-Fredes@qt.io>2020-08-31 11:08:43 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2021-06-30 16:04:55 +0200
commit84275fbde79b31676f2c419997b89c94025d7877 (patch)
treeb00d2c3dbe01cf7e2ae5eaaa4f35eef3caef348a /examples/corelib
parent4ee3c492e3fd19d7f863f0e2853901e0cb8f2c9e (diff)
PySide6: Add QSharedMemory example
Task-number: PYSIDE-1370 Change-Id: Ica8cf855f59bed40b0d2c7ba5dfa1323871337bb Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'examples/corelib')
-rw-r--r--examples/corelib/ipc/sharedmemory/dialog.py140
-rw-r--r--examples/corelib/ipc/sharedmemory/dialog.ui47
-rw-r--r--examples/corelib/ipc/sharedmemory/image.pngbin0 -> 10199 bytes
-rw-r--r--examples/corelib/ipc/sharedmemory/main.py62
-rw-r--r--examples/corelib/ipc/sharedmemory/qt.pngbin0 -> 2991 bytes
-rw-r--r--examples/corelib/ipc/sharedmemory/sharedmemory.pyproject3
-rw-r--r--examples/corelib/ipc/sharedmemory/ui_dialog.py57
7 files changed, 309 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..8045330e2
--- /dev/null
+++ b/examples/corelib/ipc/sharedmemory/dialog.py
@@ -0,0 +1,140 @@
+############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## BSD License Usage
+## Alternatively, you may use this file under the terms of the BSD license
+## as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+############################################################################
+
+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."))
diff --git a/examples/corelib/ipc/sharedmemory/dialog.ui b/examples/corelib/ipc/sharedmemory/dialog.ui
new file mode 100644
index 000000000..e99d6fb3c
--- /dev/null
+++ b/examples/corelib/ipc/sharedmemory/dialog.ui
@@ -0,0 +1,47 @@
+<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>
diff --git a/examples/corelib/ipc/sharedmemory/image.png b/examples/corelib/ipc/sharedmemory/image.png
new file mode 100644
index 000000000..dd9345306
--- /dev/null
+++ b/examples/corelib/ipc/sharedmemory/image.png
Binary files differ
diff --git a/examples/corelib/ipc/sharedmemory/main.py b/examples/corelib/ipc/sharedmemory/main.py
new file mode 100644
index 000000000..13e8f9dff
--- /dev/null
+++ b/examples/corelib/ipc/sharedmemory/main.py
@@ -0,0 +1,62 @@
+############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## BSD License Usage
+## Alternatively, you may use this file under the terms of the BSD license
+## as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+############################################################################
+
+"""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())
diff --git a/examples/corelib/ipc/sharedmemory/qt.png b/examples/corelib/ipc/sharedmemory/qt.png
new file mode 100644
index 000000000..4f68e162d
--- /dev/null
+++ b/examples/corelib/ipc/sharedmemory/qt.png
Binary files differ
diff --git a/examples/corelib/ipc/sharedmemory/sharedmemory.pyproject b/examples/corelib/ipc/sharedmemory/sharedmemory.pyproject
new file mode 100644
index 000000000..14fe88f13
--- /dev/null
+++ b/examples/corelib/ipc/sharedmemory/sharedmemory.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["dialog.py", "dialog.ui", "image.png", "main.py", "qt.png"]
+}
diff --git a/examples/corelib/ipc/sharedmemory/ui_dialog.py b/examples/corelib/ipc/sharedmemory/ui_dialog.py
new file mode 100644
index 000000000..891c7b847
--- /dev/null
+++ b/examples/corelib/ipc/sharedmemory/ui_dialog.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'dialog.ui'
+##
+## Created by: Qt User Interface Compiler version 6.2.0
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QDialog, QGridLayout, QLabel,
+ QPushButton, QSizePolicy)
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ if not Dialog.objectName():
+ Dialog.setObjectName(u"Dialog")
+ Dialog.resize(451, 322)
+ self.gridLayout = QGridLayout(Dialog)
+ self.gridLayout.setObjectName(u"gridLayout")
+ self.loadFromFileButton = QPushButton(Dialog)
+ self.loadFromFileButton.setObjectName(u"loadFromFileButton")
+
+ self.gridLayout.addWidget(self.loadFromFileButton, 0, 0, 1, 1)
+
+ self.label = QLabel(Dialog)
+ self.label.setObjectName(u"label")
+ self.label.setAlignment(Qt.AlignCenter)
+ self.label.setWordWrap(True)
+
+ self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
+
+ self.loadFromSharedMemoryButton = QPushButton(Dialog)
+ self.loadFromSharedMemoryButton.setObjectName(u"loadFromSharedMemoryButton")
+
+ self.gridLayout.addWidget(self.loadFromSharedMemoryButton, 2, 0, 1, 1)
+
+
+ self.retranslateUi(Dialog)
+
+ QMetaObject.connectSlotsByName(Dialog)
+ # setupUi
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None))
+ self.loadFromFileButton.setText(QCoreApplication.translate("Dialog", u"Load Image From File...", None))
+ self.label.setText(QCoreApplication.translate("Dialog", u"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.", None))
+ self.loadFromSharedMemoryButton.setText(QCoreApplication.translate("Dialog", u"Display Image From Shared Memory", None))
+ # retranslateUi
+