From 0dc0b5b64a0ed9ff682737f91423c9beeb5a8646 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 17 Jan 2019 11:08:08 +0100 Subject: Add QtRemoteObjects classes For starters, add the classes so that ready-made classes like QAbstractItemModelReplica can be used. Actually implementing repc requires another step. Task-number: PYSIDE-862 Change-Id: I28adb1d45c262f298f0ad1926198ec6a3013542f Reviewed-by: Qt CI Bot Reviewed-by: Alexandru Croitor --- .../remoteobjects/modelview/modelviewclient.py | 62 +++++++++ .../remoteobjects/modelview/modelviewserver.py | 140 +++++++++++++++++++++ sources/pyside2/CMakeLists.txt | 3 +- .../pyside2/PySide2/QtRemoteObjects/CMakeLists.txt | 44 +++++++ .../QtRemoteObjects/typesystem_remoteobjects.xml | 74 +++++++++++ .../pyside2/tests/QtRemoteObjects/CMakeLists.txt | 1 + 6 files changed, 323 insertions(+), 1 deletion(-) create mode 100644 examples/remoteobjects/modelview/modelviewclient.py create mode 100644 examples/remoteobjects/modelview/modelviewserver.py create mode 100644 sources/pyside2/PySide2/QtRemoteObjects/CMakeLists.txt create mode 100644 sources/pyside2/PySide2/QtRemoteObjects/typesystem_remoteobjects.xml create mode 100644 sources/pyside2/tests/QtRemoteObjects/CMakeLists.txt diff --git a/examples/remoteobjects/modelview/modelviewclient.py b/examples/remoteobjects/modelview/modelviewclient.py new file mode 100644 index 000000000..319135886 --- /dev/null +++ b/examples/remoteobjects/modelview/modelviewclient.py @@ -0,0 +1,62 @@ +############################################################################# +## +## Copyright (C) 2017 Ford Motor Company +## Copyright (C) 2019 The Qt Company Ltd. +## Contact: http://www.qt.io/licensing/ +## +## This file is part of the Qt for Python examples of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:BSD$ +## 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$ +## +############################################################################# + +"""PySide2 port of the remoteobjects/modelviewclient example from Qt v5.x""" + +import sys + +from PySide2.QtCore import QUrl +from PySide2.QtWidgets import (QApplication, QTreeView) +from PySide2.QtRemoteObjects import (QAbstractItemModelReplica, + QRemoteObjectNode) + +if __name__ == '__main__': + app = QApplication(sys.argv) + node = QRemoteObjectNode(QUrl("local:registry")) + node.setHeartbeatInterval(1000) + view = QTreeView() + view.setWindowTitle("RemoteView") + view.resize(640,480); + model = node.acquireModel("RemoteModel") + view.setModel(model); + view.show(); + + sys.exit(app.exec_()) diff --git a/examples/remoteobjects/modelview/modelviewserver.py b/examples/remoteobjects/modelview/modelviewserver.py new file mode 100644 index 000000000..069cc1d2c --- /dev/null +++ b/examples/remoteobjects/modelview/modelviewserver.py @@ -0,0 +1,140 @@ +############################################################################# +## +## Copyright (C) 2017 Ford Motor Company +## Copyright (C) 2019 The Qt Company Ltd. +## Contact: http://www.qt.io/licensing/ +## +## This file is part of the Qt for Python examples of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:BSD$ +## 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$ +## +############################################################################# + +"""PySide2 port of the remoteobjects/modelviewserver example from Qt v5.x""" + +import sys + +from PySide2.QtCore import (Qt, QByteArray, QModelIndex, QObject, QTimer, QUrl) +from PySide2.QtGui import (QColor, QStandardItemModel, QStandardItem) +from PySide2.QtWidgets import (QApplication, QTreeView) +from PySide2.QtRemoteObjects import (QRemoteObjectHost, QRemoteObjectNode, + QRemoteObjectRegistryHost) + +class TimerHandler(QObject): + def __init__(self, model): + super(TimerHandler, self).__init__() + self._model = model + + def change_data(self): + for i in range(10, 50): + self._model.setData(self._model.index(i, 1), + QColor(Qt.blue), Qt.BackgroundRole) + + def insert_data(self): + self._model.insertRows(2, 9); + for i in range(2, 11): + self._model.setData(self._model.index(i, 1), + QColor(Qt.green), Qt.BackgroundRole) + self._model.setData(self._model.index(i, 1), + "InsertedRow", Qt.DisplayRole) + + def remove_data(self): + self._model.removeRows(2, 4) + + def change_flags(self): + item = self._model.item(0, 0) + item.setEnabled(False) + item = item.child(0, 0) + item.setFlags(item.flags() & Qt.ItemIsSelectable) + + def move_data(self): + self._model.moveRows(QModelIndex(), 2, 4, QModelIndex(), 10) + + +def add_child(num_children, nesting_level): + result = [] + if nesting_level == 0: + return result; + for i in range(num_children): + child = QStandardItem("Child num {}, nesting Level {}".format(i + 1, + nesting_level)) + if i == 0: + child.appendRow(add_child(num_children, nesting_level -1)) + result.append(child) + return result; + +if __name__ == '__main__': + app = QApplication(sys.argv) + model_size = 100000; + list = [] + source_model = QStandardItemModel() + horizontal_header_list = ["First Column with spacing", + "Second Column with spacing"] + source_model.setHorizontalHeaderLabels(horizontal_header_list) + for i in range(model_size): + first_item = QStandardItem("FancyTextNumber {}".format(i)) + if i == 0: + first_item.appendRow(add_child(2, 2)) + second_item = QStandardItem("FancyRow2TextNumber {}".format(i)) + if i % 2 == 0: + first_item.setBackground(Qt.red) + row = [first_item, second_item] + source_model.invisibleRootItem().appendRow(row) + list.append("FancyTextNumber {}".format(i)) + + # Needed by QMLModelViewClient + role_names = { + Qt.DisplayRole : QByteArray(b'_text'), + Qt.BackgroundRole : QByteArray(b'_color') + } + source_model.setItemRoleNames(role_names) + + roles = [Qt.DisplayRole, Qt.BackgroundRole] + + print("Creating registry host") + node = QRemoteObjectRegistryHost(QUrl("local:registry")) + + node2 = QRemoteObjectHost(QUrl("local:replica"), QUrl("local:registry")) + node2.enableRemoting(source_model, "RemoteModel", roles) + + view = QTreeView() + view.setWindowTitle("SourceView") + view.setModel(source_model) + view.show() + handler = TimerHandler(source_model) + QTimer.singleShot(5000, handler.change_data) + QTimer.singleShot(10000, handler.insert_data) + QTimer.singleShot(11000, handler.change_flags) + QTimer.singleShot(12000, handler.remove_data) + QTimer.singleShot(13000, handler.move_data) + + sys.exit(app.exec_()) diff --git a/sources/pyside2/CMakeLists.txt b/sources/pyside2/CMakeLists.txt index 1d563fb44..2fb5cedf5 100644 --- a/sources/pyside2/CMakeLists.txt +++ b/sources/pyside2/CMakeLists.txt @@ -353,7 +353,8 @@ if(APPLE) endif() # Collect all optional modules. -set(ALL_OPTIONAL_MODULES Xml XmlPatterns Help Multimedia MultimediaWidgets OpenGL Positioning Location Qml Quick QuickWidgets Scxml Script ScriptTools Sensors TextToSpeech Charts Svg DataVisualization) +set(ALL_OPTIONAL_MODULES Xml XmlPatterns Help Multimedia +MultimediaWidgets OpenGL Positioning Location Qml Quick QuickWidgets RemoteObjects Scxml Script ScriptTools Sensors TextToSpeech Charts Svg DataVisualization) find_package(Qt5UiTools) if(Qt5UiTools_FOUND) list(APPEND ALL_OPTIONAL_MODULES UiTools) diff --git a/sources/pyside2/PySide2/QtRemoteObjects/CMakeLists.txt b/sources/pyside2/PySide2/QtRemoteObjects/CMakeLists.txt new file mode 100644 index 000000000..29b49d895 --- /dev/null +++ b/sources/pyside2/PySide2/QtRemoteObjects/CMakeLists.txt @@ -0,0 +1,44 @@ +project(QtRemoteObjects) + +set(QtRemoteObjects_SRC +${QtRemoteObjects_GEN_DIR}/qabstractitemmodelreplica_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectabstractpersistedstore_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectdynamicreplica_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjecthost_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjecthostbase_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectnode_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectpendingcall_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectpendingcallwatcher_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectregistry_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectregistryhost_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectreplica_wrapper.cpp +# ${QtRemoteObjects_GEN_DIR}/qtremoteobjects_wrapper.cpp +${QtRemoteObjects_GEN_DIR}/qremoteobjectsettingsstore_wrapper.cpp + +# module is always needed +${QtRemoteObjects_GEN_DIR}/qtremoteobjects_module_wrapper.cpp +) + +set(QtRemoteObjects_include_dirs ${QtRemoteObjects_SOURCE_DIR} + ${QtRemoteObjects_BINARY_DIR} + ${Qt5RemoteObjects_INCLUDE_DIRS} + ${SHIBOKEN_INCLUDE_DIR} + ${libpyside_SOURCE_DIR} + ${SHIBOKEN_PYTHON_INCLUDE_DIR} + ${QtCore_GEN_DIR}) + +set(QtRemoteObjects_libraries pyside2 + ${SHIBOKEN_PYTHON_LIBRARIES} + ${SHIBOKEN_LIBRARY} + ${Qt5RemoteObjects_LIBRARIES}) + +set(QtRemoteObjects_deps QtCore QtNetwork) + +create_pyside_module(NAME QtRemoteObjects + INCLUDE_DIRS QtRemoteObjects_include_dirs + LIBRARIES QtRemoteObjects_libraries + DEPS QtRemoteObjects_deps + TYPESYSTEM_PATH QtRemoteObjects_SOURCE_DIR + SOURCES QtRemoteObjects_SRC + TYPESYSTEM_NAME ${QtRemoteObjects_BINARY_DIR}/typesystem_remoteobjects.xml + ) diff --git a/sources/pyside2/PySide2/QtRemoteObjects/typesystem_remoteobjects.xml b/sources/pyside2/PySide2/QtRemoteObjects/typesystem_remoteobjects.xml new file mode 100644 index 000000000..8058cb56c --- /dev/null +++ b/sources/pyside2/PySide2/QtRemoteObjects/typesystem_remoteobjects.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/pyside2/tests/QtRemoteObjects/CMakeLists.txt b/sources/pyside2/tests/QtRemoteObjects/CMakeLists.txt new file mode 100644 index 000000000..2f7cb08b9 --- /dev/null +++ b/sources/pyside2/tests/QtRemoteObjects/CMakeLists.txt @@ -0,0 +1 @@ +# Please add some tests, here -- cgit v1.2.3