Qt Widgets,是否必须将包含小部件设置为父级?

时间:2016-01-29 17:47:29

标签: c++ qt widget qt5

我想在容器QWidget中插入一个QWidget(通过它的布局),但是避免将插入的窗口小部件嵌入到容器窗口小部件中。

这背后有充分的理由,插入的小部件是一个绑定到文档的工具箱,当文档成为活动文档时,此工具箱将被发送到浮动小部件。

这可能吗?

1 个答案:

答案 0 :(得分:1)

  

我想在容器QWidget中插入一个QWidget(通过它   布局),但避免将插入的窗口小部件嵌套到容器中   窗口小部件。

     

这背后有充分的理由,插入的小部件是一个工具箱   绑定到文档,此工具箱被发送到浮动停靠小部件   当文档成为活动文档时。

     

这可能吗?

这个简单的答案是否 - 无法避免小部件成为父级。但坚持下去。首先,为什么答案是否定的。那么我们怎样才能做你想做的事。

设置窗口小部件的布局会执行隐式父窗口设置。 为布局设置窗口小部件会执行隐式父窗口设置。

QVBoxLayout* layout = new QVBoxLayout; // no parent yet
this->setLayout(layout);               // it does layout->setParent(this);
QWidget* widget = new MyWidget;        // no parent yet
layout->addWidget( widget );           // it does widget->setParent(this);
  

如果layout是另一个小部件上的布局管理器,则setLayout()   将重新定义布局并使其成为布局管理器   窗口小部件。

使用QLayout重新定位有点复杂,因为addWidget会调用addItem:

  

void QLayout :: addItem(QLayoutItem * item)

     

在子类中实现以添加项目。如何添加是具体的   到每个子类。

     

通常不会在应用程序代码中调用此函数。添加一个   widget到布局,使用addWidget()函数;添加一个孩子   布局,使用相关QLayout提供的addLayout()函数   子类。

     

注意:项目的所有权转移到布局中,而且它是   布局有责任删除它。

     

另请参阅addWidget(),QBoxLayout :: addLayout()和   QGridLayout :: addLayout()。

     

void QLayout :: addWidget(QWidget * w)

     

以特定于布局的方式将小部件w添加到此布局。这个   函数使用addItem()。

但我们仍然可以对此类请求采取措施:

  

这背后有充分的理由,插入的小部件是一个工具箱   绑定到文档,此工具箱被发送到浮动停靠小部件   当文档成为活动文档时。

     

这可能吗?

但这当然是可能的。比如,通过调用QWidget::setParent来说,这是我们需要将父级移动到新布局时的常见做法。