From 6c7064fa23d5e872e7698ec4f646d39782fb9921 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 13 May 2023 01:37:41 +0200 Subject: [PATCH 1/3] Implemented fix for issue #1357 (RBA/pya binding for QObject#findChildren) --- scripts/mkqtdecl_common/common.conf | 45 ++++++++++++++++++++++++-- src/gsiqt/qt4/QtCore/gsiDeclQObject.cc | 43 ++++++++++++++++++++++-- src/gsiqt/qt5/QtCore/gsiDeclQObject.cc | 43 ++++++++++++++++++++++-- src/gsiqt/qt6/QtCore/gsiDeclQObject.cc | 43 ++++++++++++++++++++++-- testdata/ruby/qtbinding.rb | 22 +++++++++++++ 5 files changed, 187 insertions(+), 9 deletions(-) diff --git a/scripts/mkqtdecl_common/common.conf b/scripts/mkqtdecl_common/common.conf index fe4f2da1f..378d6e1c6 100644 --- a/scripts/mkqtdecl_common/common.conf +++ b/scripts/mkqtdecl_common/common.conf @@ -62,15 +62,54 @@ DECL end # -------------------------------------------------------------- -# Provides the definitions for QObject::findChild +# Provides the definitions for QObject::findChild and QObject::findChildren def add_native_impl_QObject_findChild() # alternative implementation for QObject::findChild using QObject for T add_native_impl("QObject", <<'CODE', <<'DECL') - QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild (name); } + +#if QT_VERSION < 0x50000 + + QObject *find_child_impl (QObject *object, const QString &name) + { + return object->findChild (name); + } + QList find_children_impl (QObject *object, const QString &name) + { + return object->findChildren (name); + } + QList find_children_impl2 (QObject *object, const QRegularExpression &re) + { + return object->findChildren (re); + } +#else + +#include + + QObject *find_child_impl (QObject *object, const QString &name, Qt::FindChildOptions options) + { + return object->findChild (name, options); + } + QList find_children_impl (QObject *object, const QString &name, Qt::FindChildOptions options) + { + return object->findChildren (name, options); + } + QList find_children_impl2 (QObject *object, const QRegularExpression &re, Qt::FindChildOptions options) + { + return object->findChildren (re, options); + } +#endif CODE - gsi::method_ext("findChild", &find_child_impl, "@brief Specialisation for findChild (uses QObject as T).") +#if QT_VERSION < 0x50000 + gsi::method_ext("findChild", &find_child_impl, gsi::arg("name", QString(), "null"), "@brief Specialisation for findChild (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl, gsi::arg("name", QString(), "null"), "@brief Specialisation for findChildren (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl2, gsi::arg("re"), "@brief Specialisation for findChildren (uses QObject as T).") +#else + gsi::method_ext("findChild", &find_child_impl, gsi::arg("name", QString(), "null"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChild (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl, gsi::arg("name", QString(), "null"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChildren (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl2, gsi::arg("re"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChildren (uses QObject as T).") +#endif DECL end diff --git a/src/gsiqt/qt4/QtCore/gsiDeclQObject.cc b/src/gsiqt/qt4/QtCore/gsiDeclQObject.cc index 81e440d14..2a9929f86 100644 --- a/src/gsiqt/qt4/QtCore/gsiDeclQObject.cc +++ b/src/gsiqt/qt4/QtCore/gsiDeclQObject.cc @@ -51,7 +51,38 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g ret.write (QObject::staticMetaObject); } - QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild (name); } + +#if QT_VERSION < 0x50000 + + QObject *find_child_impl (QObject *object, const QString &name) + { + return object->findChild (name); + } + QList find_children_impl (QObject *object, const QString &name) + { + return object->findChildren (name); + } + QList find_children_impl2 (QObject *object, const QRegularExpression &re) + { + return object->findChildren (re); + } +#else + +#include + + QObject *find_child_impl (QObject *object, const QString &name, Qt::FindChildOptions options) + { + return object->findChild (name, options); + } + QList find_children_impl (QObject *object, const QString &name, Qt::FindChildOptions options) + { + return object->findChildren (name, options); + } + QList find_children_impl2 (QObject *object, const QRegularExpression &re, Qt::FindChildOptions options) + { + return object->findChildren (re, options); + } +#endif // bool QObject::blockSignals(bool b) @@ -757,7 +788,15 @@ static gsi::Methods methods_QObject () { } qt_gsi::QtNativeClass decl_QObject ("QtCore", "QObject_Native", - gsi::method_ext("findChild", &find_child_impl, "@brief Specialisation for findChild (uses QObject as T).") +#if QT_VERSION < 0x50000 + gsi::method_ext("findChild", &find_child_impl, gsi::arg("name", QString(), "null"), "@brief Specialisation for findChild (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl, gsi::arg("name", QString(), "null"), "@brief Specialisation for findChildren (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl2, gsi::arg("re"), "@brief Specialisation for findChildren (uses QObject as T).") +#else + gsi::method_ext("findChild", &find_child_impl, gsi::arg("name", QString(), "null"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChild (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl, gsi::arg("name", QString(), "null"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChildren (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl2, gsi::arg("re"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChildren (uses QObject as T).") +#endif + methods_QObject (), "@hide\n@alias QObject"); diff --git a/src/gsiqt/qt5/QtCore/gsiDeclQObject.cc b/src/gsiqt/qt5/QtCore/gsiDeclQObject.cc index 8b2376519..aa5d7c29d 100644 --- a/src/gsiqt/qt5/QtCore/gsiDeclQObject.cc +++ b/src/gsiqt/qt5/QtCore/gsiDeclQObject.cc @@ -52,7 +52,38 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g ret.write (QObject::staticMetaObject); } - QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild (name); } + +#if QT_VERSION < 0x50000 + + QObject *find_child_impl (QObject *object, const QString &name) + { + return object->findChild (name); + } + QList find_children_impl (QObject *object, const QString &name) + { + return object->findChildren (name); + } + QList find_children_impl2 (QObject *object, const QRegularExpression &re) + { + return object->findChildren (re); + } +#else + +#include + + QObject *find_child_impl (QObject *object, const QString &name, Qt::FindChildOptions options) + { + return object->findChild (name, options); + } + QList find_children_impl (QObject *object, const QString &name, Qt::FindChildOptions options) + { + return object->findChildren (name, options); + } + QList find_children_impl2 (QObject *object, const QRegularExpression &re, Qt::FindChildOptions options) + { + return object->findChildren (re, options); + } +#endif // bool QObject::blockSignals(bool b) @@ -813,7 +844,15 @@ static gsi::Methods methods_QObject () { } qt_gsi::QtNativeClass decl_QObject ("QtCore", "QObject_Native", - gsi::method_ext("findChild", &find_child_impl, "@brief Specialisation for findChild (uses QObject as T).") +#if QT_VERSION < 0x50000 + gsi::method_ext("findChild", &find_child_impl, gsi::arg("name", QString(), "null"), "@brief Specialisation for findChild (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl, gsi::arg("name", QString(), "null"), "@brief Specialisation for findChildren (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl2, gsi::arg("re"), "@brief Specialisation for findChildren (uses QObject as T).") +#else + gsi::method_ext("findChild", &find_child_impl, gsi::arg("name", QString(), "null"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChild (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl, gsi::arg("name", QString(), "null"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChildren (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl2, gsi::arg("re"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChildren (uses QObject as T).") +#endif + methods_QObject (), "@hide\n@alias QObject"); diff --git a/src/gsiqt/qt6/QtCore/gsiDeclQObject.cc b/src/gsiqt/qt6/QtCore/gsiDeclQObject.cc index 5220ea53d..aafe61ded 100644 --- a/src/gsiqt/qt6/QtCore/gsiDeclQObject.cc +++ b/src/gsiqt/qt6/QtCore/gsiDeclQObject.cc @@ -52,7 +52,38 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g ret.write (QObject::staticMetaObject); } - QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild (name); } + +#if QT_VERSION < 0x50000 + + QObject *find_child_impl (QObject *object, const QString &name) + { + return object->findChild (name); + } + QList find_children_impl (QObject *object, const QString &name) + { + return object->findChildren (name); + } + QList find_children_impl2 (QObject *object, const QRegularExpression &re) + { + return object->findChildren (re); + } +#else + +#include + + QObject *find_child_impl (QObject *object, const QString &name, Qt::FindChildOptions options) + { + return object->findChild (name, options); + } + QList find_children_impl (QObject *object, const QString &name, Qt::FindChildOptions options) + { + return object->findChildren (name, options); + } + QList find_children_impl2 (QObject *object, const QRegularExpression &re, Qt::FindChildOptions options) + { + return object->findChildren (re, options); + } +#endif // bool QObject::blockSignals(bool b) @@ -771,7 +802,15 @@ static gsi::Methods methods_QObject () { } qt_gsi::QtNativeClass decl_QObject ("QtCore", "QObject_Native", - gsi::method_ext("findChild", &find_child_impl, "@brief Specialisation for findChild (uses QObject as T).") +#if QT_VERSION < 0x50000 + gsi::method_ext("findChild", &find_child_impl, gsi::arg("name", QString(), "null"), "@brief Specialisation for findChild (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl, gsi::arg("name", QString(), "null"), "@brief Specialisation for findChildren (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl2, gsi::arg("re"), "@brief Specialisation for findChildren (uses QObject as T).") +#else + gsi::method_ext("findChild", &find_child_impl, gsi::arg("name", QString(), "null"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChild (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl, gsi::arg("name", QString(), "null"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChildren (uses QObject as T).") + + gsi::method_ext("findChildren", &find_children_impl2, gsi::arg("re"), gsi::arg("options", Qt::FindChildrenRecursively, "Qt::FindChildrenRecursively"), "@brief Specialisation for findChildren (uses QObject as T).") +#endif + methods_QObject (), "@hide\n@alias QObject"); diff --git a/testdata/ruby/qtbinding.rb b/testdata/ruby/qtbinding.rb index 356aaa29e..b66e090fd 100644 --- a/testdata/ruby/qtbinding.rb +++ b/testdata/ruby/qtbinding.rb @@ -767,6 +767,28 @@ class QtBinding_TestClass < TestBase end + def test_60 + + # findChild, findChildren + + w = RBA::QWidget::new + w.objectName = "w" + w1 = RBA::QWidget::new(w) + w1.objectName = "w1" + w2 = RBA::QWidget::new(w1) + w2.objectName = "w2" + + assert_equal(w.findChild.objectName, "w1") + assert_equal(w.findChild("w2").objectName, "w2") + + assert_equal(w.findChildren().collect { |c| c.objectName }.join(","), "w1,w2") + assert_equal(w.findChildren("w2").collect { |c| c.objectName }.join(","), "w2") + + assert_equal(w.findChildren(RBA::QRegularExpression::new("^.2$")).collect { |c| c.objectName }.join(","), "w2") + assert_equal(w.findChildren(RBA::QRegularExpression::new("^w.$")).collect { |c| c.objectName }.join(","), "w1,w2") + + end + end load("test_epilogue.rb") From 67db8dfc96c9543880e2c84b60c48f8fa2255cf9 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 13 May 2023 19:41:37 +0200 Subject: [PATCH 2/3] Trying to fix Qt4 builds --- scripts/mkqtdecl_common/common.conf | 4 +++- src/gsiqt/qt4/QtCore/gsiDeclQObject.cc | 4 +++- src/gsiqt/qt5/QtCore/gsiDeclQObject.cc | 4 +++- src/gsiqt/qt6/QtCore/gsiDeclQObject.cc | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/scripts/mkqtdecl_common/common.conf b/scripts/mkqtdecl_common/common.conf index 378d6e1c6..1a07a185b 100644 --- a/scripts/mkqtdecl_common/common.conf +++ b/scripts/mkqtdecl_common/common.conf @@ -71,6 +71,8 @@ def add_native_impl_QObject_findChild() #if QT_VERSION < 0x50000 +#include + QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild (name); @@ -79,7 +81,7 @@ def add_native_impl_QObject_findChild() { return object->findChildren (name); } - QList find_children_impl2 (QObject *object, const QRegularExpression &re) + QList find_children_impl2 (QObject *object, const QRegExp &re) { return object->findChildren (re); } diff --git a/src/gsiqt/qt4/QtCore/gsiDeclQObject.cc b/src/gsiqt/qt4/QtCore/gsiDeclQObject.cc index 2a9929f86..2ab3add1e 100644 --- a/src/gsiqt/qt4/QtCore/gsiDeclQObject.cc +++ b/src/gsiqt/qt4/QtCore/gsiDeclQObject.cc @@ -54,6 +54,8 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g #if QT_VERSION < 0x50000 +#include + QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild (name); @@ -62,7 +64,7 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g { return object->findChildren (name); } - QList find_children_impl2 (QObject *object, const QRegularExpression &re) + QList find_children_impl2 (QObject *object, const QRegExp &re) { return object->findChildren (re); } diff --git a/src/gsiqt/qt5/QtCore/gsiDeclQObject.cc b/src/gsiqt/qt5/QtCore/gsiDeclQObject.cc index aa5d7c29d..70ccedc94 100644 --- a/src/gsiqt/qt5/QtCore/gsiDeclQObject.cc +++ b/src/gsiqt/qt5/QtCore/gsiDeclQObject.cc @@ -55,6 +55,8 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g #if QT_VERSION < 0x50000 +#include + QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild (name); @@ -63,7 +65,7 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g { return object->findChildren (name); } - QList find_children_impl2 (QObject *object, const QRegularExpression &re) + QList find_children_impl2 (QObject *object, const QRegExp &re) { return object->findChildren (re); } diff --git a/src/gsiqt/qt6/QtCore/gsiDeclQObject.cc b/src/gsiqt/qt6/QtCore/gsiDeclQObject.cc index aafe61ded..f4a89d144 100644 --- a/src/gsiqt/qt6/QtCore/gsiDeclQObject.cc +++ b/src/gsiqt/qt6/QtCore/gsiDeclQObject.cc @@ -55,6 +55,8 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g #if QT_VERSION < 0x50000 +#include + QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild (name); @@ -63,7 +65,7 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g { return object->findChildren (name); } - QList find_children_impl2 (QObject *object, const QRegularExpression &re) + QList find_children_impl2 (QObject *object, const QRegExp &re) { return object->findChildren (re); } From 77ce1d48255dc8d7a45a5e3e843479ac8d9a9e86 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 13 May 2023 21:11:41 +0200 Subject: [PATCH 3/3] Another fix for Qt4 --- testdata/ruby/qtbinding.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/testdata/ruby/qtbinding.rb b/testdata/ruby/qtbinding.rb index b66e090fd..f0164c397 100644 --- a/testdata/ruby/qtbinding.rb +++ b/testdata/ruby/qtbinding.rb @@ -784,8 +784,15 @@ class QtBinding_TestClass < TestBase assert_equal(w.findChildren().collect { |c| c.objectName }.join(","), "w1,w2") assert_equal(w.findChildren("w2").collect { |c| c.objectName }.join(","), "w2") - assert_equal(w.findChildren(RBA::QRegularExpression::new("^.2$")).collect { |c| c.objectName }.join(","), "w2") - assert_equal(w.findChildren(RBA::QRegularExpression::new("^w.$")).collect { |c| c.objectName }.join(","), "w1,w2") + begin + # Qt5++ + re_cls = RBA::QRegularExpression + rescue => ex + # Qt4 + re_cls = RBA::QRegExp + end + assert_equal(w.findChildren(re_cls::new("^.2$")).collect { |c| c.objectName }.join(","), "w2") + assert_equal(w.findChildren(re_cls::new("^w.$")).collect { |c| c.objectName }.join(","), "w1,w2") end