Есть ли простой способ ограничения QObject :: findChild () только для прямых детей? - PullRequest
2 голосов
/ 05 января 2012

Вопрос в названии. Я не могу найти ничего очевидного в документации , которая предлагает способ сделать это. Должен ли я использовать рекурсивные методы поиска детей и последовательно проверять родительский указатель каждого ребенка, чтобы отфильтровать непрямых детей?

Между прочим, документация, по-видимому, ссылается на "прямых предков", под которыми я думаю, что это означает "прямой потомок".

(редактировать: я ищу простоту, поэтому для ответа не нужно использовать метод findChild().)

Ответы [ 4 ]

6 голосов
/ 23 февраля 2012

У меня добавлен флаг к QObject :: findChild () в Qt 5, который называется Qt::FindDirectChildOnly, что позволяет вам делать именно это.

Так что эта проблема скоро станет проблемой прошлого: -)

4 голосов
/ 05 января 2012
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 голосов
/ 06 января 2012

На основании ответа, данного 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 голосов
/ 05 января 2012
QObject* find(QObject* parent, const QString& objName)
{
    foreach (QObject* child, parent->children())
    {
        if (child->objectName() == objName)
        {
            return child;
        }
    }
    return 0;
}
...