2012-01-05 16 views
2

質問がタイトルにあります。私はthe documentationでこれを行う方法を示唆している何かを見つけることができません。私は再帰的な子どもを使ってメソッドを見つけ、各子の親ポインタを順番にテストして、非直接的な子供をフィルタリングする必要がありますか?QObject :: findChild()を直接的な子供に限定する簡単な方法はありますか?

なお、文書は、「直接的な子孫」を意味する「直接祖先」を参照しているようです。

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

答えて

6

私はQtの5中QObject::findChild()からadded旗を持っているが、あなたはまさにこれを実行することを可能にする、Qt::FindDirectChildOnlyと呼ばれます。

だから、この問題はすぐに確か

+0

あなたはスターです:)変更要求へのリンクはありますか? –

+0

https://qt.gitorious.org/qt/qtbase/merge_requests/40 –

0
QObject* find(QObject* parent, const QString& objName) 
{ 
    foreach (QObject* child, parent->children()) 
    { 
     if (child->objectName() == objName) 
     { 
      return child; 
     } 
    } 
    return 0; 
} 
+0

答え(そうありがとう):-)過去の問題になりますが、私は 'objectName'が設定されているに依存しないことを好むだろう。親と子の名前が設定されていないと、誤検出が容易になる可能性があります。 –

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の回答に基づいています。

0

the answer given by 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

ループ内でtakeFirst()を使用してコンテナを空にすることは、非常に遅い解決方法です。可能であればconst繰り返しを推奨します。 –

+0

性能に関して合意しましたが、私はこれを使用しませんでしたが、時期尚早の最適化だと主張していました。私は "私は単純さを探しています"と明言しました:) –

+0

const反復はこれよりも複雑ではありません私は、何かを適切に行うことは、「良い」や「悪い」方法の明確なガイドラインがある場合には時期尚早の最適化ではないと主張します。これが一度限りのプロジェクトでない限り、それはちょうどあなたをかむために戻ってくる種類のものです。 –

関連する問題