Implemented fix for issue #1357 (RBA/pya binding for QObject#findChildren)

This commit is contained in:
Matthias Koefferlein 2023-05-13 01:37:41 +02:00
parent 7169910607
commit 6c7064fa23
5 changed files with 187 additions and 9 deletions

View File

@ -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<QObject *> (name); }
#if QT_VERSION < 0x50000
QObject *find_child_impl (QObject *object, const QString &name)
{
return object->findChild<QObject *> (name);
}
QList<QObject *> find_children_impl (QObject *object, const QString &name)
{
return object->findChildren<QObject *> (name);
}
QList<QObject *> find_children_impl2 (QObject *object, const QRegularExpression &re)
{
return object->findChildren<QObject *> (re);
}
#else
#include <QRegularExpression>
QObject *find_child_impl (QObject *object, const QString &name, Qt::FindChildOptions options)
{
return object->findChild<QObject *> (name, options);
}
QList<QObject *> find_children_impl (QObject *object, const QString &name, Qt::FindChildOptions options)
{
return object->findChildren<QObject *> (name, options);
}
QList<QObject *> find_children_impl2 (QObject *object, const QRegularExpression &re, Qt::FindChildOptions options)
{
return object->findChildren<QObject *> (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

View File

@ -51,7 +51,38 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g
ret.write<const QMetaObject &> (QObject::staticMetaObject);
}
QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild<QObject *> (name); }
#if QT_VERSION < 0x50000
QObject *find_child_impl (QObject *object, const QString &name)
{
return object->findChild<QObject *> (name);
}
QList<QObject *> find_children_impl (QObject *object, const QString &name)
{
return object->findChildren<QObject *> (name);
}
QList<QObject *> find_children_impl2 (QObject *object, const QRegularExpression &re)
{
return object->findChildren<QObject *> (re);
}
#else
#include <QRegularExpression>
QObject *find_child_impl (QObject *object, const QString &name, Qt::FindChildOptions options)
{
return object->findChild<QObject *> (name, options);
}
QList<QObject *> find_children_impl (QObject *object, const QString &name, Qt::FindChildOptions options)
{
return object->findChildren<QObject *> (name, options);
}
QList<QObject *> find_children_impl2 (QObject *object, const QRegularExpression &re, Qt::FindChildOptions options)
{
return object->findChildren<QObject *> (re, options);
}
#endif
// bool QObject::blockSignals(bool b)
@ -757,7 +788,15 @@ static gsi::Methods methods_QObject () {
}
qt_gsi::QtNativeClass<QObject> 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");

View File

@ -52,7 +52,38 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g
ret.write<const QMetaObject &> (QObject::staticMetaObject);
}
QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild<QObject *> (name); }
#if QT_VERSION < 0x50000
QObject *find_child_impl (QObject *object, const QString &name)
{
return object->findChild<QObject *> (name);
}
QList<QObject *> find_children_impl (QObject *object, const QString &name)
{
return object->findChildren<QObject *> (name);
}
QList<QObject *> find_children_impl2 (QObject *object, const QRegularExpression &re)
{
return object->findChildren<QObject *> (re);
}
#else
#include <QRegularExpression>
QObject *find_child_impl (QObject *object, const QString &name, Qt::FindChildOptions options)
{
return object->findChild<QObject *> (name, options);
}
QList<QObject *> find_children_impl (QObject *object, const QString &name, Qt::FindChildOptions options)
{
return object->findChildren<QObject *> (name, options);
}
QList<QObject *> find_children_impl2 (QObject *object, const QRegularExpression &re, Qt::FindChildOptions options)
{
return object->findChildren<QObject *> (re, options);
}
#endif
// bool QObject::blockSignals(bool b)
@ -813,7 +844,15 @@ static gsi::Methods methods_QObject () {
}
qt_gsi::QtNativeClass<QObject> 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");

View File

@ -52,7 +52,38 @@ static void _call_smo (const qt_gsi::GenericStaticMethod *, gsi::SerialArgs &, g
ret.write<const QMetaObject &> (QObject::staticMetaObject);
}
QObject *find_child_impl (QObject *object, const QString &name) { return object->findChild<QObject *> (name); }
#if QT_VERSION < 0x50000
QObject *find_child_impl (QObject *object, const QString &name)
{
return object->findChild<QObject *> (name);
}
QList<QObject *> find_children_impl (QObject *object, const QString &name)
{
return object->findChildren<QObject *> (name);
}
QList<QObject *> find_children_impl2 (QObject *object, const QRegularExpression &re)
{
return object->findChildren<QObject *> (re);
}
#else
#include <QRegularExpression>
QObject *find_child_impl (QObject *object, const QString &name, Qt::FindChildOptions options)
{
return object->findChild<QObject *> (name, options);
}
QList<QObject *> find_children_impl (QObject *object, const QString &name, Qt::FindChildOptions options)
{
return object->findChildren<QObject *> (name, options);
}
QList<QObject *> find_children_impl2 (QObject *object, const QRegularExpression &re, Qt::FindChildOptions options)
{
return object->findChildren<QObject *> (re, options);
}
#endif
// bool QObject::blockSignals(bool b)
@ -771,7 +802,15 @@ static gsi::Methods methods_QObject () {
}
qt_gsi::QtNativeClass<QObject> 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");

View File

@ -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")