12

快速提问。有没有办法(轻松)在 Qt 中检索小部件的父布局?

PS:出于逻辑原因,QObject::parent() 不起作用。

编辑:我很肯定小部件有一个父布局,因为我在代码的前面将它添加到了一个布局中。现在,我在窗口中有许多其他布局,虽然我可以跟踪它们,但我只想知道是否有一种简单而干净的方法来获取父布局。

EDIT2:对不起,“简单而干净”可能不是最好的放置方式。我的意思是使用 Qt API。

EDIT3:我将小部件添加到布局中,如下所示:

QHBoxLayout* 布局 = 新 QHBoxLayout;

布局->addWidget(按钮);

4

7 回答 7

5

(更新答案)

我想这并不容易。因为 Widget 在技术上可以包含在多个布局中(例如,在垂直布局内对齐的水平布局)。

请记住,如果 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 回答
2

只需使用:

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

我假设button是包含布局的小部件的子组件,其中包含button. button->parentWidget()返回一个指向按钮父级小部件的指针,并返回指向父级布局的指针。->layout()

于 2016-05-12T12:22:43.367 回答
1

使用 widget.parent().layout() 和搜索蛮力(包括递归)是我唯一的建议。也许您可以搜索“名称”。

于 2010-03-09T14:10:05.437 回答
1

经过一番探索,我找到了解决问题的“部分”解决方案。

如果您正在创建布局并使用它管理小部件,则可以稍后在代码中使用 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;

此方法仅在您创建布局时适用。如果您没有创建布局并设置它,那么以后就没有简单的方法来检索它。此外,您还必须跟踪布局并在必要时更新managementLayout 属性。

于 2010-03-13T08:29:13.770 回答
-3

你试过这个吗?不要忘记检查 NULL。

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

如果parent_layout等于 NULL,则父窗口小部件不是布局。

于 2010-03-09T14:15:48.300 回答
-3

你试过QWidget::layout()吗?

于 2010-03-09T14:33:22.873 回答