是否有一种简单的方法将QObject :: findChild()限制为仅指向子项?

时间:2012-01-05 09:37:57

标签: qt qobject

问题在标题中。我在the documentation中找不到任何明显可行的方法。我必须使用递归子节点查找方法并按顺序测试每个子节点的父指针以过滤掉非直接子节点吗?

顺便提一下,文档似乎是指“直接祖先”,我认为这意味着“直系后代”。

(编辑:我正在寻找简洁性,所以答案不必使用findChild()方法。)

4 个答案:

答案 0 :(得分:6)

我在Qt 5中addedQObject::findChild()个标记,名为Qt::FindDirectChildOnly,可以让你做到这一点。

所以这个问题很快就会成为过去的问题: - )

答案 1 :(得分:4)

template <class T>
T findDirectChild(const QObject* parent, const QString& name = QString())
{
    foreach (QObject* child, parent->children())
    {
        T temp = qobject_cast<T>(child);
        if (temp && (name.isNull() || name == child->objectName()))
            return temp;
    }
    return 0;
}

将根据具有可选名称的类型进行过滤的模板版本。 根据TheHorse的回答。

答案 2 :(得分:0)

QObject* find(QObject* parent, const QString& objName)
{
    foreach (QObject* child, parent->children())
    {
        if (child->objectName() == objName)
        {
            return child;
        }
    }
    return 0;
}

答案 3 :(得分:0)

基于the answer given by skyhisi,确切答案将按如下方式实施,更符合我的需求。

ChildClass const * ParentClass::_getPointerToDirectChild() const
{
    QObjectList allDirectChildren = this->children();
    QObject * anObject = 0;
    ChildClass const * aChild = 0;

    while (allDirectChildren.isEmpty() == false)
    {
        anObject = allDirectChildren.takeFirst();
        aChild = qobject_cast<ChildClass *>(anObject);
        if (aChild) return aChild;
    }

    return aChild;
}