12

簡単な質問です。Qtでウィジェットの親レイアウトを(簡単に)取得する方法はありますか?

PS: 論理的な理由から、 QObject::parent() は機能しません。

編集:コードの早い段階でレイアウトに追加したため、ウィジェットには親レイアウトがあると確信しています。現在、ウィンドウには他にも多くのレイアウトがあり、それらを追跡することは可能ですが、親レイアウトを取得する簡単でクリーンな方法があるかどうかを知りたいだけです.

EDIT2:申し訳ありませんが、「簡単できれい」というのはおそらく最良の方法ではありませんでした. Qt API を使用するつもりでした。

EDIT3:次のようにウィジェットをレイアウトに追加しています:

QHBoxLayout* レイアウト = 新しい QHBoxLayout;

レイアウト->addWidget(ボタン);

4

7 に答える 7

5

(更新された回答)

そうなるとなかなか出来ないことだと思います。ウィジェットは技術的に複数のレイアウトに含めることができるため (たとえば、垂直レイアウト内に配置された水平レイアウト)。

レイアウトに配置されている場合、QWidget の親は変更されないことに注意してください。

その場合、おそらく自分でそれを追跡する必要があります。

于 2010-03-09T14:14:58.973 に答える
4

解決しました!使用法: QLayout* parentLayout = findParentLayout(addedWidget)

QLayout* findParentLayout(QWidget* w, QLayout* topLevelLayout)
{
  for (QObject* qo: topLevelLayout->children())
  {
     QLayout* layout = qobject_cast<QLayout*>(qo);
     if (layout != nullptr)
     {
        if (layout->indexOf(w) > -1)
          return layout;
        else if (!layout->children().isEmpty())
        {
          layout = findParentLayout(w, layout);
          if (layout != nullptr)
            return layout;
        }
     }
  }
  return nullptr;
}

QLayout* findParentLayout(QWidget* w)
{
    if (w->parentWidget() != nullptr)
        if (w->parentWidget()->layout() != nullptr)
            return findParentLayout(w, w->parentWidget()->layout());
    return nullptr;
}
于 2016-05-12T12:05:12.620 に答える
1

いくつかの調査の後、問題の「部分的な」解決策を見つけました。

レイアウトを作成し、それを使用してウィジェットを管理している場合は、Qt の動的プロパティを使用してコードの後半でこのレイアウトを取得できます。ここで、QWidget::setProperty() を使用するには、保存するオブジェクトが登録済みのメタ タイプである必要があります。QHBoxLayout へのポインターは登録済みのメタ タイプではありませんが、2 つの回避策があります。最も簡単な回避策は、コードの任意の場所にこれを追加してオブジェクトを登録することです。

Q_DECLARE_METATYPE(QHBoxLayout*)

2 番目の回避策は、オブジェクトをラップすることです。

struct Layout {
    QHBoxLayout* layout;
};
Q_DECLARE_METATYPE(Layout)

オブジェクトが登録済みのメタ タイプになったら、次の方法で保存できます。

QHBoxLayout* layout = new QHBoxLayout;
QWidget* widget = new QWidget;
widget->setProperty("managingLayout", QVariant::fromValue(layout));
layout->addWidget(widget);

または、2 番目の回避策を使用した場合は、次のようにします。

QHBoxLayout* layout = new QHBoxLayout;
QWidget* widget = new QWidget;
Layout l;
l.layout = layout;
widget->setProperty("managingLayout", QVariant::fromValue(l));
layout->addWidget(widget);

後でレイアウトを取得する必要がある場合は、次の方法で取得できます。

QHBoxLayout* layout = widget->property("managingLayout").value<QHBoxLayout*>();

またはこのように:

Layout l = widget->property("managingLayout").value<Layout>();
QHBoxLayout* layout = l.layout;

このアプローチは、レイアウトを作成した場合にのみ適用できます。レイアウトを作成して設定しなかった場合、後でそれを取得する簡単な方法はありません。また、レイアウトを追跡し、必要に応じて ManagingLayout プロパティを更新する必要があります。

于 2010-03-13T08:29:13.770 に答える
1

widget.parent().layout() を使用し、総当たり検索 (再帰を含む) が私の唯一のアドバイスです。「名前」で検索してもいいかもしれません。

于 2010-03-09T14:10:05.437 に答える
-3

これを試しましたか?NULL をチェックすることを忘れないでください。

QLayout *parent_layout = qobject_cast< QLayout* >( parent() );

parent_layoutNULL の場合、親ウィジェットはレイアウトではありません。

于 2010-03-09T14:15:48.300 に答える
-3

試しましたQWidget::layout()か?

于 2010-03-09T14:33:22.873 に答える