如何检查QObject是否是QObject的后代?

时间:2019-10-14 09:16:45

标签: qt qt5

QObject* a;
QObject* b;

//a and b are created somewhere else

bool existed = b.contains(a);//check if b contains a recursively

我想知道是否存在对此的任何API?

2 个答案:

答案 0 :(得分:4)

为此,您可以使用不带任何参数的QObject::findChildren

类似这样的东西:

bool exists = b->findChildren<QObject*>().contains(a);

请注意,我认为您需要这样做的事实可能意味着设计错误,因此您应该重新考虑您要完成的工作,而不必采取这种措施。很有可能这是无法完成的,但不要只是继续做这种事情,因为这很丑陋,如果您从一开始就依赖它,它会变得非常缓慢。

答案 1 :(得分:2)

与其询问“'a'是'b'的后代吗?”尝试将其转过来并询问“ b是a的祖先吗?”。然后,只需重复调用QObject::parent。像(未经测试的)...

bool is_ancestor_of (const QObject *descendant, const QObject *ancestor)
{
    if (!ancestor)
        return false;
    while (descendant) {
        if (descendant == ancestor)
            return true;
        descendant = descendant->parent();
    }
    return false;
}