Получение родительского макета в Qt - PullRequest
7 голосов
/ 09 марта 2010

быстрый вопрос. Есть ли способ (легко) получить родительский макет виджета в Qt?

PS: QObject :: parent () не будет работать по логическим причинам.

EDIT: Я уверен, что виджет имеет родительский макет, потому что я добавил его в макет ранее в коде. Теперь у меня есть много других макетов в окне, и хотя я могу отслеживать их, я просто хочу знать, есть ли простой и чистый способ получить родительский макет.

EDIT2: Извините, «легко и чисто» было, вероятно, не лучшим способом. Я имел в виду использование Qt API.

EDIT3: Я добавляю виджет в макет так:

QHBoxLayout * layout = new QHBoxLayout;

layout-> addWidget (кнопка);

Ответы [ 7 ]

5 голосов
/ 09 марта 2010

(обновленный ответ)

Полагаю, тогда это сделать нелегко. Поскольку технически виджет может содержаться в нескольких макетах (например, горизонтальный макет, который выровнен внутри вертикального макета).

Просто помните, что родитель QWidget не изменяется, если он выровнен в макете.

Тогда, возможно, вам придется следить за этим самостоятельно.

2 голосов
/ 12 мая 2016

РЕШИТЬ! Использование: QLayout * parentLayout = findParentLayout (AddedWidget)

QLayout* findParentLayout(QWidget* w)
{
    if (w->parentWidget() != nullptr)
        if (w->parentWidget()->layout() != nullptr)
            return layout = findParentLayout(w, w->parentWidget()->layout());
    return nullptr;
}

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;
};
1 голос
/ 12 мая 2016

Просто используйте:

QHBoxLayout* parentLayout = button->parentWidget()->layout();

Я предполагаю, что button является дочерним элементом виджета, который содержит макет , который содержит button. button->parentWidget() возвращает указатель на виджет родительского элемента и ->layout() возвращает указатель на макет родительского элемента.

1 голос
/ 13 марта 2010

После некоторого исследования я нашел «частичное» решение проблемы.

Если вы создаете макет и управляете им с помощью виджета, этот макет можно получить позже в коде, используя динамические свойства Qt. Теперь, чтобы использовать QWidget :: setProperty (), объект, который вы собираетесь хранить, должен быть зарегистрированным мета-типом. Указатель на QHBoxLayout не является зарегистрированным мета-типом, но есть два обходных пути. Самый простой обходной путь - зарегистрировать объект, добавив его в любое место кода:

Q_DECLARE_METATYPE(QHBoxLayout*)

Второй способ - обернуть объект:

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);

Или так, если вы использовали второй обходной путь:

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;

Этот подход применим только при создании макета. Если вы не создали макет и не установили его, то не существует простого способа получить его позже. Также вам придется отслеживать макет и обновлять свойство manageLayout при необходимости.

1 голос
/ 09 марта 2010

используйте widget.parent (). Layout () и поиск грубой силы (включая рекурсию) - мой единственный совет. Может быть, вы можете искать быть "имя".

0 голосов
/ 09 марта 2010

Вы пробовали QWidget::layout()?

0 голосов
/ 09 марта 2010

Вы пробовали это? Не забудьте проверить NULL.

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

Если parent_layout равно NULL, то родительский виджет не является макетом.

...