diff options
author | Cristian Maureira-Fredes <[email protected]> | 2020-08-31 11:08:43 +0200 |
---|---|---|
committer | Friedemann Kleint <[email protected]> | 2021-06-30 16:04:55 +0200 |
commit | 84275fbde79b31676f2c419997b89c94025d7877 (patch) | |
tree | b00d2c3dbe01cf7e2ae5eaaa4f35eef3caef348a /examples/corelib/ipc | |
parent | 4ee3c492e3fd19d7f863f0e2853901e0cb8f2c9e (diff) |
PySide6: Add QSharedMemory example
Task-number: PYSIDE-1370
Change-Id: Ica8cf855f59bed40b0d2c7ba5dfa1323871337bb
Reviewed-by: Christian Tismer <[email protected]>
Diffstat (limited to 'examples/corelib/ipc')
-rw-r--r-- | examples/corelib/ipc/sharedmemory/dialog.py | 140 | ||||
-rw-r--r-- | examples/corelib/ipc/sharedmemory/dialog.ui | 47 | ||||
-rw-r--r-- | examples/corelib/ipc/sharedmemory/image.png | bin | 0 -> 10199 bytes | |||
-rw-r--r-- | examples/corelib/ipc/sharedmemory/main.py | 62 | ||||
-rw-r--r-- | examples/corelib/ipc/sharedmemory/qt.png | bin | 0 -> 2991 bytes | |||
-rw-r--r-- | examples/corelib/ipc/sharedmemory/sharedmemory.pyproject | 3 | ||||
-rw-r--r-- | examples/corelib/ipc/sharedmemory/ui_dialog.py | 57 |
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 Binary files differnew file mode 100644 index 000000000..dd9345306 --- /dev/null +++ b/examples/corelib/ipc/sharedmemory/image.png 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 Binary files differnew file mode 100644 index 000000000..4f68e162d --- /dev/null +++ b/examples/corelib/ipc/sharedmemory/qt.png 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 + |