在 QLayout 和 QWidget 之间转换

Posted

技术标签:

【中文标题】在 QLayout 和 QWidget 之间转换【英文标题】:Convert between QLayout and QWidget 【发布时间】:2014-06-17 11:27:41 【问题描述】:

我有两个示例,我基本上是在创建包装对象,而不是理想情况下的简单转换。

如果foo 是之前实例化的QWidget*,我可以避免为其创建包装器QLayout

const auto layout = new QVBoxLayout();
layout->addWidget( foo );
const auto frame = new QLabel( QLatin1String( "Why Do I Need a Layout?" ) );
frame->setLayout( layout );

如果foo 是之前实例化的QLayout*,我可以避免为其创建包装器QWidget

const auto widget = new QWidget();
widget->setLayout( foo );
const auto tabs = new QTabWidget();
tabs->addTab( widget, QLatin1String( "Why Do I Need a Widget?" ) );

【问题讨论】:

我不确定你在问什么,或者你想要实现什么。能否补充一些细节? layout 是一个包装器,我不需要QLayout,它没有任何作用,但我不能调用frame->setWidget( foo ); 因为QLabel 没有那个功能。我在问是否有一种方法可以跳过 layout 包装器。 widget 包装器也是如此。 澄清一下:您想在不添加 Layout 的情况下将子组件添加到 Widget,并且希望将 Layout 添加为预期 QWidget 的子组件? 小部件不必有布局。您可以通过将其设置为父小部件来添加子小部件,但是您必须手动调整子小部件的大小和位置。 @JonathanMee 是的,这是关于第一个案例。我并不是说它会实现相同的行为。就像我说的,您必须手动调整子小部件的大小和位置。 【参考方案1】:

总是可以编写自己的包装函数:

QLayout* wrap(QWidget* w)
    auto layout = new QVBoxLayout();
    layout->addWidget( w );
    return layout;

QWidget* wrap(QLayout* l)
    auto widget = new QWidget();
    widget->setLayout( l );
    return widget;

【讨论】:

嗯...如果没有更直接的转换方式,我想这是合理的。【参考方案2】:

小部件不必有布局。您可以通过将小部件设置为其父小部件来将子小部件添加到小部件。但随后您将不得不手动调整子小部件的大小和位置。

【讨论】:

这是我的情况的最佳答案,但这是一个非常独特的情况。对于普通民众,@BeniBela 提供的解决方案可能更可取。

以上是关于在 QLayout 和 QWidget 之间转换的主要内容,如果未能解决你的问题,请参考以下文章

试图将 QLayout "" 添加到 QWidget "",它已经有一个布局

QT删除QWidget或QLayout下的控件

QT编程,如何把自定义的QWidget的一个派生类放入Qlayout中,不能显示了。

从 QLayout 中删除 QWidgets?

QT。向 QLayout 添加新布局

QLayout.replace 不替换