2012-01-05 23 views
2

问题出现在标题中。在the documentation中我找不到任何明显的表示这样做的方法。我是否必须使用递归子查找方法并依次测试每个孩子的父指针以筛选出非直接的孩子?是否有一个简单的方法来限制QObject :: findChild()仅指导孩子?

顺便说一下,文档似乎指的是“直接的祖先”,我认为它的意思是“直系后裔”。

(编辑:我在寻找简单,所以答案不必使用findChild()法)

回答

6

我有added一个标志来QObject::findChild() Qt中5名为Qt::FindDirectChildOnly,它允许你做的正是这一点。

那么这个问题将很快成为过去的问题:-)

+0

你是明星:)你有链接到变更请求? – 2012-02-23 18:21:23

+0

https://qt.gitorious.org/qt/qtbase/merge_requests/40 – 2012-02-23 18:44:42

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

肯定的答案(所以谢谢你),但我不希望靠'objectName'设定。如果父母和孩子没有设置他们的名字,这很容易产生误报。 – 2012-01-05 11:08:23

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的回答。

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; 
} 
+0

使用循环中的takeFirst()清空容器是非常缓慢的解决方案。在可能的情况下优先使用常量迭代,在这里肯定是这种情况。 – 2012-02-23 17:48:53

+0

同意性能我不会使用这个,但我会认为这是过早的优化,我明确指出“我正在寻找简单性:) :) – 2012-02-23 18:24:52

+0

常量迭代不是比这更复杂(它实际上更简单),而且我认为,如果对“好”和“坏”的方式有一个明确的指导方针,那么正确地做一些事情并不是过早的优化。除非这是一个一次性的项目,否则这正是会回来咬你的那种东西。 – 2015-10-09 17:58:42

相关问题