Qt 有没有一种简单的方法可以将QObject::findChild()限制为仅对子对象进行引导?

Qt 有没有一种简单的方法可以将QObject::findChild()限制为仅对子对象进行引导?,qt,qobject,Qt,Qobject,问题在标题中。我找不到任何明显的迹象表明可以这样做。我必须使用递归子级查找方法并按顺序测试每个子级的父级指针以筛选出非直接子级吗 顺便说一句,文档中似乎提到了“直系祖先”,我认为它的意思是“直系后代” (编辑:我希望简单,因此答案不必使用findChild()方法。)模板 T findDirectChild(const QObject*parent,const QString&name=QString()) { foreach(QObject*子对象,父对象->子对象()) { 温度=QoObj

问题在标题中。我找不到任何明显的迹象表明可以这样做。我必须使用递归子级查找方法并按顺序测试每个子级的父级指针以筛选出非直接子级吗

顺便说一句,文档中似乎提到了“直系祖先”,我认为它的意思是“直系后代”

(编辑:我希望简单,因此答案不必使用
findChild()
方法。)

模板
T findDirectChild(const QObject*parent,const QString&name=QString())
{
foreach(QObject*子对象,父对象->子对象())
{
温度=QoObject_cast(儿童);
if(temp&&(name.isNull()| | name==child->objectName())
返回温度;
}
返回0;
}
将根据具有可选名称的类型进行筛选的模板版本。 基于马的回答。

基于确切的答案,将按以下方式实施,这更符合我的需要

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;
}
ChildClass常量*ParentClass::getPointerToDirectChild()常量
{
QObjectList allDirectChildren=this->children();
QObject*anObject=0;
ChildClass常量*aChild=0;
while(allDirectChildren.isEmpty()==false)
{
anObject=allDirectChildren.takeFirst();
aChild=QoObject\u cast(一个对象);
如果(aChild)返回aChild;
}
回程跟腱;
}
我在Qt5中有一个标记to,名为
Qt::FindDirectChildOnly
,它允许您准确地执行此操作


因此,这个问题很快就会成为过去的问题:-)

当然是一个答案(非常感谢),但我不希望依赖设置的
objectName
。如果父级和子级未设置名称,则很容易产生误报。清空循环中包含takeFirst()的容器是一个非常缓慢的解决方案。在可能的情况下,更喜欢常数迭代,这里肯定是这样。就性能而言,我同意我不会使用它,但我认为这是过早的优化,我明确表示“我在寻求简单”:)常数迭代并不比这更复杂(实际上更简单),我想说的是,如果有一个明确的“好”和“坏”的方法指导方针,那么正确地做一些事情并不是过早的优化。除非这是一个一次性的项目,否则这正是你想要的。你是明星:)你有变更请求的链接吗?
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;
}
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;
}