在Qt中获取父布局

Aus*_*tin 8 c++ layout parents qt

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

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

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

编辑2:对不起,"简单干净"可能不是最好的推杆方式.我的意思是使用Qt API.

编辑3:我正在将小部件添加到布局中,如下所示:

QHBoxLayout*layout = new QHBoxLayout;

布图设计> addWidget(按钮);

小智 9

不幸的是,QWidget API没有提供QWidget::parentLayout()方法,但这里有一个经过测试且有效的实现。

用法:QLayout *layout = parentLayout(myWidget);

QLayout *parentLayout(const QWidget *widget, QLayout *layout) {
    int itemCount = layout ? layout->count() : 0;
    for (int i = 0; i < itemCount; i++) {
        if (layout->itemAt(i)->widget() == widget) {
            return layout;
        } else if (QLayout *itemLayout = parentLayout(widget, layout->itemAt(i)->layout())) {
            return itemLayout;
        }
    }
    return nullptr;
}

QLayout *parentLayout(const QWidget *widget) {
    QLayout *layout = widget->parentWidget() ? widget->parentWidget()->layout() : nullptr;
    return parentLayout(widget, layout);
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*Ben 5

(更新的答案)

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

请记住,如果QWidget的父级在布局中对齐,则它不会更改.

那么你可能需要自己跟踪.


Aus*_*tin 1

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

如果您要创建布局并用它管理小部件,则可以稍后在代码中使用 Qt 的动态属性来检索此布局。现在,要使用 QWidget::setProperty(),您要存储的对象需要是已注册的元类型。指向 QHBoxLayout 的指针不是已注册的元类型,但有两种解决方法。最简单的解决方法是通过在代码中的任意位置添加以下内容来注册对象:

Q_DECLARE_METATYPE(QHBoxLayout*)
Run Code Online (Sandbox Code Playgroud)

第二种解决方法是包装对象:

struct Layout {
    QHBoxLayout* layout;
};
Q_DECLARE_METATYPE(Layout)
Run Code Online (Sandbox Code Playgroud)

一旦对象是已注册的元类型,您可以通过以下方式保存它:

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

或者如果您使用第二种解决方法,则可以这样:

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

稍后当您需要检索布局时,可以通过以下方式检索:

QHBoxLayout* layout = widget->property("managingLayout").value<QHBoxLayout*>();
Run Code Online (Sandbox Code Playgroud)

或者像这样:

Layout l = widget->property("managingLayout").value<Layout>();
QHBoxLayout* layout = l.layout;
Run Code Online (Sandbox Code Playgroud)

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