質問はタイトルにあります。これを行う方法を示唆するドキュメントには明らかなものが見つかりません。再帰的な子の検索メソッドを使用し、各子の親ポインターを順番にテストして、非直接の子を除外する必要がありますか?
ちなみに、ドキュメンテーションは「直接の祖先」を参照しているようで、それによって「直接の子孫」を意味すると思います。
(編集:私は単純さを探しているので、答えはfindChild()
メソッドを使用する必要はありません。)
Qt 5 のQObject::findChild()にというフラグを追加しました。これにより、まさにこれを行うことができます。Qt::FindDirectChildOnly
したがって、この問題はすぐに過去の問題になります:-)
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 の回答に基づいています。
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;
}
QObject* find(QObject* parent, const QString& objName)
{
foreach (QObject* child, parent->children())
{
if (child->objectName() == objName)
{
return child;
}
}
return 0;
}