aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-04-04 23:09:14 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-04-05 14:25:08 +0200
commite15bccb0e1f40b959801860f14578c0d77ba8176 (patch)
tree861471140bb32eb44cc915074a1d6589515a4f8c
parent11126a9811b21886acdac1e484a92044d7ffd5a2 (diff)
shiboken: Fix Qt properties not working in classes inheriting QObject
The fixes for PYSIDE-803 caused setattro methods to be generated for many classes, resulting in QObject's setattro method no longer being called. Generate property code in each class inheriting QObject. Task-number: PYSIDE-803 Fixes: PYSIDE-1255 Change-Id: I56f52fb43c4ddc77914090ac122776050354ddbe Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r--sources/pyside2/tests/pysidetest/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/pysidetest/properties_test.py132
-rw-r--r--sources/shiboken2/generator/shiboken2/shibokengenerator.cpp7
3 files changed, 140 insertions, 0 deletions
diff --git a/sources/pyside2/tests/pysidetest/CMakeLists.txt b/sources/pyside2/tests/pysidetest/CMakeLists.txt
index 3ba2ad29d..46a8023c3 100644
--- a/sources/pyside2/tests/pysidetest/CMakeLists.txt
+++ b/sources/pyside2/tests/pysidetest/CMakeLists.txt
@@ -143,6 +143,7 @@ PYSIDE_TEST(mixin_signal_slots_test.py)
PYSIDE_TEST(modelview_test.py)
PYSIDE_TEST(new_inherited_functions_test.py)
PYSIDE_TEST(notify_id.py)
+PYSIDE_TEST(properties_test.py)
PYSIDE_TEST(qapp_like_a_macro_test.py)
PYSIDE_TEST(qvariant_test.py)
PYSIDE_TEST(repr_test.py)
diff --git a/sources/pyside2/tests/pysidetest/properties_test.py b/sources/pyside2/tests/pysidetest/properties_test.py
new file mode 100644
index 000000000..cedfac8d1
--- /dev/null
+++ b/sources/pyside2/tests/pysidetest/properties_test.py
@@ -0,0 +1,132 @@
+#############################################################################
+##
+## Copyright (C) 2020 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of Qt for Python.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## 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 General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## 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-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import os
+import sys
+import unittest
+
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+from init_paths import init_test_paths
+init_test_paths(False)
+
+from PySide2.QtCore import QObject, QStringListModel, Signal, Property, Slot
+
+"""Tests PySide2.QtCore.Property()"""
+
+
+class TestObject(QObject):
+
+ valueChanged = Signal()
+
+ def __init__(self, parent=None):
+ super(TestObject, self).__init__(parent)
+ self._value = -1
+ self.valueChanged.connect(self._changed)
+ self.getter_called = 0
+ self.setter_called = 0
+ self.changed_emitted = 0
+
+ @Slot(int)
+ def _changed(self):
+ self.changed_emitted += 1
+
+ def getValue(self):
+ self.getter_called += 1
+ return self._value
+
+ def setValue(self, value):
+ self.setter_called += 1
+ if (self._value != value):
+ self._value = value
+ self.valueChanged.emit()
+
+ value = Property(int, fget=getValue, fset=setValue,
+ notify=valueChanged)
+
+
+class TestDerivedObject(QStringListModel):
+
+ valueChanged = Signal()
+
+ def __init__(self, parent=None):
+ super(TestDerivedObject, self).__init__(parent)
+ self._value = -1
+ self.valueChanged.connect(self._changed)
+ self.getter_called = 0
+ self.setter_called = 0
+ self.changed_emitted = 0
+
+ @Slot(int)
+ def _changed(self):
+ self.changed_emitted += 1
+
+ def getValue(self):
+ self.getter_called += 1
+ return self._value
+
+ def setValue(self, value):
+ self.setter_called += 1
+ if (self._value != value):
+ self._value = value
+ self.valueChanged.emit()
+
+ value = Property(int, fget=getValue, fset=setValue,
+ notify=valueChanged)
+
+
+class PropertyTest(unittest.TestCase):
+
+ def test1Object(self):
+ """Basic property test."""
+ testObject = TestObject()
+ v = testObject.value
+ self.assertEqual(v, -1)
+ self.assertEqual(testObject.getter_called, 1)
+ testObject.value = 42
+ v = testObject.value
+ self.assertEqual(v, 42)
+ self.assertEqual(testObject.changed_emitted, 1)
+ self.assertEqual(testObject.setter_called, 1)
+ self.assertEqual(testObject.getter_called, 2)
+
+ def test2DerivedObject(self):
+ """PYSIDE-1255: Run the same test for a class inheriting QObject."""
+ testObject = TestDerivedObject()
+ v = testObject.value
+ self.assertEqual(v, -1)
+ self.assertEqual(testObject.getter_called, 1)
+ testObject.value = 42
+ v = testObject.value
+ self.assertEqual(v, 42)
+ self.assertEqual(testObject.changed_emitted, 1)
+ self.assertEqual(testObject.setter_called, 1)
+ self.assertEqual(testObject.getter_called, 2)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
index fbd3c314b..a712c3ebb 100644
--- a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
+++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
@@ -2219,6 +2219,13 @@ ShibokenGenerator::AttroCheck ShibokenGenerator::checkAttroFunctionNeeds(const A
result |= AttroCheckFlag::SetattroQObject;
if (useOverrideCaching(metaClass))
result |= AttroCheckFlag::SetattroMethodOverride;
+ // PYSIDE-1255: If setattro is generated for a class inheriting
+ // QObject, the property code needs to be generated, too.
+ if ((result & AttroCheckFlag::SetattroMask) != 0
+ && !result.testFlag(AttroCheckFlag::SetattroQObject)
+ && metaClass->isQObject()) {
+ result |= AttroCheckFlag::SetattroQObject;
+ }
}
return result;
}