Как проверить, является ли QObject потомком QObject? - PullRequest
1 голос
/ 14 октября 2019
QObject* a;
QObject* b;

//a and b are created somewhere else

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

Мне интересно, существует ли какой-либо API для этого?

Ответы [ 2 ]

4 голосов
/ 14 октября 2019

Вы можете использовать QObject::findChildren без каких-либо аргументов для этой цели:

Примерно так:

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

Обратите внимание, что я думаю, что факт вам нуженэто может означать ошибку проектирования, и вам следует переосмыслить то, что вы пытаетесь выполнить таким образом, чтобы этот взлом не был необходим. Вполне возможно, что этого нельзя сделать, но не просто продолжайте делать подобные вещи, поскольку это довольно уродливо и может стать мучительно медленным, если вы полагаетесь на это с самого начала.

2 голосов
/ 14 октября 2019

Вместо того, чтобы спрашивать "является ли" а "потомком" б "?"попробуйте перевернуть его и спросить: «Является ли« b »предком« а »?». Затем просто используйте повторные вызовы на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...