aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-11-18 13:27:04 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-11-19 17:50:52 +0000
commit1c1134fe90e9f185ab4b052a829dd8bf5ff0e0e8 (patch)
tree48ba09d8e1058bee1467e49d3ec7d089e8fa480c
parentac3a289ad1f8cec6e2ad8b0a266df8d1de6d3fa5 (diff)
PySide6: Add a sequence protocol for QRegion
Fixes: PYSIDE-1714 Change-Id: I581e8088e25ab31afdfc6cd5a15c55a5b418ffdc Reviewed-by: Christian Tismer <tismer@stackless.com> (cherry picked from commit 943aa9ef6fef7533a3566f230aaf878efe46725e) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml6
-rw-r--r--sources/pyside6/PySide6/glue/qtgui.cpp14
-rw-r--r--sources/pyside6/tests/QtGui/qregion_test.py10
3 files changed, 29 insertions, 1 deletions
diff --git a/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml b/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml
index 82098e01a..caecca7bf 100644
--- a/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml
+++ b/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml
@@ -444,6 +444,12 @@
</value-type>
<value-type name="QRegion" >
<enum-type name="RegionType"/>
+ <add-function signature="__len__">
+ <inject-code class="target" position="beginning" file="../glue/qtgui.cpp" snippet="qregion-len"/>
+ </add-function>
+ <add-function signature="__getitem__">
+ <inject-code class="target" position="beginning" file="../glue/qtgui.cpp" snippet="qregion-getitem"/>
+ </add-function>
<!-- ### This operator does not make sense in Python. -->
<modify-function signature="operator&amp;=(QRegion)" remove="all"/>
<modify-function signature="operator&amp;=(QRect)" remove="all"/>
diff --git a/sources/pyside6/PySide6/glue/qtgui.cpp b/sources/pyside6/PySide6/glue/qtgui.cpp
index 39d5bf0ae..5630406a4 100644
--- a/sources/pyside6/PySide6/glue/qtgui.cpp
+++ b/sources/pyside6/PySide6/glue/qtgui.cpp
@@ -718,6 +718,20 @@ else
%PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
// @snippet qdrag-exec-arg2
+// @snippet qregion-len
+return %CPPSELF.rectCount();
+// @snippet qregion-len
+
+// @snippet qregion-getitem
+if (_i < 0 || _i >= %CPPSELF.rectCount()) {
+ PyErr_SetString(PyExc_IndexError, "index out of bounds");
+ return nullptr;
+}
+
+const QRect cppResult = *(%CPPSELF.cbegin() + _i);
+return %CONVERTTOPYTHON[QRect](cppResult);
+// @snippet qregion-getitem
+
/*********************************************************************
* CONVERSIONS
********************************************************************/
diff --git a/sources/pyside6/tests/QtGui/qregion_test.py b/sources/pyside6/tests/QtGui/qregion_test.py
index e5b6a1d56..fddd04a89 100644
--- a/sources/pyside6/tests/QtGui/qregion_test.py
+++ b/sources/pyside6/tests/QtGui/qregion_test.py
@@ -36,7 +36,7 @@ from init_paths import init_test_paths
init_test_paths(False)
from PySide6.QtGui import QRegion
-from PySide6.QtCore import QPoint
+from PySide6.QtCore import QPoint, QRect, QSize
from helper.usesqapplication import UsesQApplication
@@ -52,6 +52,14 @@ class QRegionTest(UsesQApplication):
self.assertTrue(ru.contains(QPoint(10, 10)))
self.assertTrue(ru.contains(QPoint(14, 14)))
+ def testSequence(self):
+ region = QRegion()
+ region += QRect(QPoint(0, 0), QSize(10, 10))
+ region += QRect(QPoint(10, 0), QSize(20, 20))
+ self.assertEqual(len(region), 2)
+ for r in region:
+ pass
+
if __name__ == '__main__':
unittest.main()