2

質問はタイトルにあります。これを行う方法を示唆するドキュメントには明らかなものが見つかりません。再帰的な子の検索メソッドを使用し、各子の親ポインターを順番にテストして、非直接の子を除外する必要がありますか?

ちなみに、ドキュメンテーションは「直接の祖先」を参照しているようで、それによって「直接の子孫」を意味すると思います。

(編集:私は単純さを探しているので、答えはfindChild()メソッドを使用する必要はありません。)

4

4 に答える 4

8

Qt 5 のQObject::findChild()にというフラグを追加しました。これにより、まさにこれを行うことができます。Qt::FindDirectChildOnly

したがって、この問題はすぐに過去の問題になります:-)

于 2012-02-23T17:48:07.583 に答える
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 の回答に基づいています。

于 2012-01-05T14:53:19.420 に答える
0

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;
}
于 2012-01-06T11:14:46.823 に答える
0
QObject* find(QObject* parent, const QString& objName)
{
    foreach (QObject* child, parent->children())
    {
        if (child->objectName() == objName)
        {
            return child;
        }
    }
    return 0;
}
于 2012-01-05T10:59:41.110 に答える