diff options
16 files changed, 407 insertions, 38 deletions
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 @@ +<?xml version="1.0"?> +<!-- +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt for Python. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +--> +<typesystem package="PySide2.QtRemoteObjects"> + <load-typesystem name="templates/core_common.xml" generate="no"/> + <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/> + <rejection class="*" function-name="getTypeNameAndMetaobjectFromClassInfo"/> +<!-- Exclude namespace due to Q_NAMESPACE link errors on Windows (QTBUG-68014) + <rejection class="QtRemoteObjects" field-name="staticMetaObject"/> + <namespace-type name="QtRemoteObjects"> + <enum-type name="InitialAction"/> + <enum-type name="QRemoteObjectPacketTypeEnum"/> + </namespace-type> +--> + <object-type name="QAbstractItemModelReplica"/> + <object-type name="QRemoteObjectAbstractPersistedStore"/> + <object-type name="QRemoteObjectDynamicReplica"/> + <object-type name="QRemoteObjectHost"/> + <object-type name="QRemoteObjectHostBase"> + <enum-type name="AllowedSchemas"/> + </object-type> + <object-type name="QRemoteObjectNode"> + <enum-type name="ErrorCode"/> + </object-type> + <object-type name="QRemoteObjectPendingCall"> + <enum-type name="Error"/> + </object-type> + <object-type name="QRemoteObjectPendingCallWatcher"/> + <object-type name="QRemoteObjectRegistry"/> + <object-type name="QRemoteObjectRegistryHost"/> + <object-type name="QRemoteObjectReplica"> + <enum-type name="State"/> + <!-- protected: <enum-type name="ConstructorType"/> --> + </object-type> + <object-type name="QRemoteObjectSettingsStore"/> +</typesystem> diff --git a/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt b/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt index 7711aecbc..68b0a632f 100644 --- a/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt +++ b/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt @@ -3,7 +3,7 @@ project(QtWebEngineWidgets) set(QtWebEngineWidgets_SRC ${QtWebEngineWidgets_GEN_DIR}/qwebenginecertificateerror_wrapper.cpp ${QtWebEngineWidgets_GEN_DIR}/qwebenginedownloaditem_wrapper.cpp -#${QtWebEngineWidgets_GEN_DIR}/qwebenginehistory_wrapper.cpp +${QtWebEngineWidgets_GEN_DIR}/qwebenginehistory_wrapper.cpp ${QtWebEngineWidgets_GEN_DIR}/qwebenginehistoryitem_wrapper.cpp ${QtWebEngineWidgets_GEN_DIR}/qwebenginepage_wrapper.cpp ${QtWebEngineWidgets_GEN_DIR}/qwebengineprofile_wrapper.cpp diff --git a/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml b/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml index b8546d824..dfe4e0d7a 100644 --- a/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml +++ b/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml @@ -58,10 +58,8 @@ <enum-type name="SavePageFormat"/> </object-type> - <!-- TODO: Deal with private constructor - <value-type name="QWebEngineHistory"/> --> - - <object-type name="QWebEngineHistoryItem"/> + <object-type name="QWebEngineHistory"/> + <value-type name="QWebEngineHistoryItem"/> <object-type name="QWebEnginePage"> <enum-type name="WebAction"/> diff --git a/sources/pyside2/PySide2/glue/qtcore.cpp b/sources/pyside2/PySide2/glue/qtcore.cpp index 4c77e9e87..ca88b9740 100644 --- a/sources/pyside2/PySide2/glue/qtcore.cpp +++ b/sources/pyside2/PySide2/glue/qtcore.cpp @@ -924,7 +924,8 @@ if (PyIndex_Check(_key)) { } if (step != 1 && value_length != slicelength) { - PyErr_Format(PyExc_ValueError, "attempt to assign %s of size %d to extended slice of size %d",Py_TYPE(_value)->tp_name, value_length, slicelength); + PyErr_Format(PyExc_ValueError, "attempt to assign %s of size %d to extended slice of size %d", + Py_TYPE(_value)->tp_name, int(value_length), int(slicelength)); return -1; } 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 diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index f6724e61d..7498d3a18 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -1367,17 +1367,21 @@ static bool _compareAbstractMetaFunctions(const AbstractMetaFunction* func, cons } AbstractMetaFunctionList AbstractMetaBuilderPrivate::classFunctionList(const ScopeModelItem &scopeItem, - bool *constructorRejected) + AbstractMetaClass::Attributes *constructorAttributes) { - *constructorRejected = false; + *constructorAttributes = 0; AbstractMetaFunctionList result; const FunctionList &scopeFunctionList = scopeItem->functions(); result.reserve(scopeFunctionList.size()); for (const FunctionModelItem &function : scopeFunctionList) { - if (AbstractMetaFunction *metaFunction = traverseFunction(function)) + if (AbstractMetaFunction *metaFunction = traverseFunction(function)) { result.append(metaFunction); - else if (function->functionType() == CodeModel::Constructor) - *constructorRejected = true; + } else if (function->functionType() == CodeModel::Constructor) { + auto arguments = function->arguments(); + *constructorAttributes |= AbstractMetaAttributes::HasRejectedConstructor; + if (arguments.isEmpty() || arguments.constFirst()->defaultValue()) + *constructorAttributes |= AbstractMetaAttributes::HasRejectedDefaultConstructor; + } } return result; } @@ -1408,12 +1412,10 @@ private: void AbstractMetaBuilderPrivate::traverseFunctions(ScopeModelItem scopeItem, AbstractMetaClass *metaClass) { - bool constructorRejected = false; + AbstractMetaAttributes::Attributes constructorAttributes; const AbstractMetaFunctionList functions = - classFunctionList(scopeItem, &constructorRejected); - - if (constructorRejected) - *metaClass += AbstractMetaAttributes::HasRejectedConstructor; + classFunctionList(scopeItem, &constructorAttributes); + metaClass->setAttributes(metaClass->attributes() | constructorAttributes); for (AbstractMetaFunction *metaFunction : functions){ metaFunction->setOriginalAttributes(metaFunction->attributes()); diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h index ec55d1b47..1633bd868 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h @@ -80,7 +80,7 @@ public: void traverseEnums(const ScopeModelItem &item, AbstractMetaClass *parent, const QStringList &enumsDeclarations); AbstractMetaFunctionList classFunctionList(const ScopeModelItem &scopeItem, - bool *constructorRejected); + AbstractMetaClass::Attributes *constructorAttributes); AbstractMetaFunctionList templateClassFunctionList(const ScopeModelItem &scopeItem, AbstractMetaClass *metaClass, bool *constructorRejected); diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h index aaefa32d5..bb17ad8d7 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h @@ -133,13 +133,14 @@ public: Invokable = 0x00040000, HasRejectedConstructor = 0x00080000, + HasRejectedDefaultConstructor = 0x00100000, - FinalCppClass = 0x00100000, - VirtualCppMethod = 0x00200000, - OverriddenCppMethod = 0x00400000, - FinalCppMethod = 0x00800000, + FinalCppClass = 0x00200000, + VirtualCppMethod = 0x00400000, + OverriddenCppMethod = 0x00800000, + FinalCppMethod = 0x01000000, // Add by meta builder (implicit constructors, inherited methods, etc) - AddedMethod = 0x01000000 + AddedMethod = 0x02000000 }; Q_DECLARE_FLAGS(Attributes, Attribute) Q_FLAG(Attribute) diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp index ea0f43170..9cfc95fd1 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -1923,6 +1923,7 @@ void CppGenerator::writeArgumentsInitializer(QTextStream& s, OverloadData& overl { const AbstractMetaFunction* rfunc = overloadData.referenceFunction(); s << "PyTuple_GET_SIZE(args);" << endl; + writeUnusedVariableCast(s, QLatin1String("numArgs")); int minArgs = overloadData.minArgs(); int maxArgs = overloadData.maxArgs(); diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp index ac0b2ffaf..a226f2c00 100644 --- a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp @@ -1055,12 +1055,26 @@ bool ShibokenGenerator::isValueTypeWithCopyConstructorOnly(const AbstractMetaCla { if (!metaClass || !metaClass->typeEntry()->isValue()) return false; - if ((metaClass->attributes() & AbstractMetaAttributes::HasRejectedConstructor) != 0) + if (metaClass->attributes().testFlag(AbstractMetaAttributes::HasRejectedDefaultConstructor)) return false; - AbstractMetaFunctionList ctors = metaClass->queryFunctions(AbstractMetaClass::Constructors); - if (ctors.count() != 1) - return false; - return ctors.constFirst()->functionType() == AbstractMetaFunction::CopyConstructorFunction; + const AbstractMetaFunctionList ctors = + metaClass->queryFunctions(AbstractMetaClass::Constructors); + bool copyConstructorFound = false; + for (auto ctor : ctors) { + switch (ctor->functionType()) { + case AbstractMetaFunction::ConstructorFunction: + return false; + case AbstractMetaFunction::CopyConstructorFunction: + copyConstructorFound = true; + break; + case AbstractMetaFunction::MoveConstructorFunction: + break; + default: + Q_ASSERT(false); + break; + } + } + return copyConstructorFound; } bool ShibokenGenerator::isValueTypeWithCopyConstructorOnly(const TypeEntry* type) const diff --git a/sources/shiboken2/tests/libsample/onlycopy.cpp b/sources/shiboken2/tests/libsample/onlycopy.cpp index 75bf23b5c..cfc7c9d99 100644 --- a/sources/shiboken2/tests/libsample/onlycopy.cpp +++ b/sources/shiboken2/tests/libsample/onlycopy.cpp @@ -28,18 +28,44 @@ #include "onlycopy.h" -OnlyCopy::OnlyCopy(const OnlyCopy& other) +class OnlyCopyPrivate +{ +public: + explicit OnlyCopyPrivate(int v = 0) : value(v) {} + + int value; +}; + +OnlyCopy::OnlyCopy(int value) : d(new OnlyCopyPrivate(value)) +{ + +} + +OnlyCopy::OnlyCopy(OnlyCopyPrivate *dIn) : d(dIn) +{ +} + +OnlyCopy::~OnlyCopy() +{ + delete d; +} + +OnlyCopy::OnlyCopy(const OnlyCopy& other) : d(new OnlyCopyPrivate(other.value())) { - m_value = other.m_value; } OnlyCopy& OnlyCopy::operator=(const OnlyCopy& other) { - m_value = other.m_value; + d->value = other.d->value; return *this; } +int OnlyCopy::value() const +{ + return d->value; +} + OnlyCopy FriendOfOnlyCopy::createOnlyCopy(int value) { diff --git a/sources/shiboken2/tests/libsample/onlycopy.h b/sources/shiboken2/tests/libsample/onlycopy.h index 2c1b255fd..84a32a951 100644 --- a/sources/shiboken2/tests/libsample/onlycopy.h +++ b/sources/shiboken2/tests/libsample/onlycopy.h @@ -32,20 +32,24 @@ #include "libsamplemacros.h" #include <list> -// These classes simulate a situation found in -// QtWebKit's QWebDatabase and QWebSecurityOrigin. +// These classes simulate a situation found in QWebEngineHistoryItem. + +class OnlyCopyPrivate; class LIBSAMPLE_API OnlyCopy { public: OnlyCopy(const OnlyCopy& other); OnlyCopy& operator=(const OnlyCopy& other); - int value() const { return m_value; } - static int getValue(OnlyCopy onlyCopy) { return onlyCopy.m_value; } - static int getValueFromReference(const OnlyCopy& onlyCopy) { return onlyCopy.m_value; } + ~OnlyCopy(); + + int value() const; + static int getValue(OnlyCopy onlyCopy) { return onlyCopy.value(); } + static int getValueFromReference(const OnlyCopy& onlyCopy) { return onlyCopy.value(); } private: - int m_value; - OnlyCopy(int value) : m_value(value) {}; + OnlyCopyPrivate *d; + explicit OnlyCopy(int value); + explicit OnlyCopy(OnlyCopyPrivate *d); // rejected due to unknown OnlyCopyPrivate friend class FriendOfOnlyCopy; }; |