在 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 "",它已经有一个布局