C++ Qt布局的父级?
如果我有以下代码:C++ Qt布局的父级?,c++,qt,C++,Qt,如果我有以下代码: QWidget* plannerLeftDisplay = new QWidget(this); QVBoxLayout* plannerLeftLayout = new QVBoxLayout(); plannerLeftLayout->addWidget(new UASListWidget()); plannerLeftDisplay->setLayout(plannerLeftLayout); 那么谁将成为plannerLeftLayout的父级呢? 我知
QWidget* plannerLeftDisplay = new QWidget(this);
QVBoxLayout* plannerLeftLayout = new QVBoxLayout();
plannerLeftLayout->addWidget(new UASListWidget());
plannerLeftDisplay->setLayout(plannerLeftLayout);
那么谁将成为plannerLeftLayout
的父级呢?
我知道在这种情况下,
UASListWidget
将有plannerlefdisplay
作为父项,但是plannerleflayout
呢?plannerlefdisplay
是父项,运行下一个代码:
this->setObjectName("this");
QWidget* plannerLeftDisplay = new QWidget(this);
plannerLeftDisplay->setObjectName("plannerLeftDisplay");
QVBoxLayout* plannerLeftLayout = new QVBoxLayout();
plannerLeftLayout->addWidget(new QWidget());
plannerLeftDisplay->setLayout(plannerLeftLayout);
qDebug() << "parent is "<< plannerLeftLayout->parent();
this->setObjectName(“this”);
QWidget*plannerLeftDisplay=新的QWidget(此);
plannerLeftDisplay->setObjectName(“plannerLeftDisplay”);
QVBoxLayout*plannerLeftLayout=新的QVBoxLayout();
plannerLeftLayout->addWidget(新的QWidget());
plannerLeftDisplay->setLayout(plannerLeftLayout);
qDebug()objectName().toLocal8Bit().data(),元对象()->className(),
objectName().toLocal8Bit().data());
返回;
}
QObject*oldParent=l->parent();
//在您的情况下,它是空的
如果(oldParent&&oldParent!=此){
如果(oldParent->isWidgetType()){
//从小部件父级窃取布局。在
//变形设计器中的布局容器小部件。
QWidget*oldParentWidget=static_cast(oldParent);
oldParentWidget->takeLayout();
}否则{
qWarning(“QWidget::setLayout:试图在%s\%s\”上设置QLayout\%s\”,而QLayout已经有父项”,
l->objectName().toLocal8Bit().data(),metaObject()->className(),
objectName().toLocal8Bit().data());
返回;
}
}
Q_D(QWidget);
l->d_func()->topLevel=true;
d->布局=l;
//重新分配程序
如果(oldParent!=this){//NULL真的!=this
l->setParent(this);//所以布局现在有了父级
l->d_func()->reparentChildWidgets(这个);
l->invalidate();
}
如果(isWindow()&&d->maybeTopData())
d->topData()->SizedJusted=false;
}
应该是这样的,因为当一些小部件有布局并且应该被删除时,您不需要手动删除布局,所有操作都将自动完成。“如果布局最初有空的父级,QWidget会拥有它吗?”是。顺便说一句,您不需要使用显式堆分配,您可以通过将小部件传递给布局的构造函数来设置小部件上的布局。例如:
int main(int argc, char ** argv) {
...
QWidget mainWidget;
...
QWidget plannerLeftDisplay(mainWidget);
QVBoxLayout plannerLeftLayout(&plannerLeftDisplay);
UASListWidget listWidget;
plannerLeftLayout.addWidget(&listWidget);
...
mainWidget.show();
return app.exec();
}
或
它将是
null
,不是吗?setlayout不会给它一个父级吗?似乎我被qt的文档弄糊涂了:如果layout是另一个小部件上的布局管理器,setlayout()将重新分配布局并使其成为此小部件的布局管理器。QWidget将拥有布局的所有权。所以,如果布局最初有空的父项,QWidget会拥有它吗?
int main(int argc, char ** argv) {
...
QWidget mainWidget;
...
QWidget plannerLeftDisplay(mainWidget);
QVBoxLayout plannerLeftLayout(&plannerLeftDisplay);
UASListWidget listWidget;
plannerLeftLayout.addWidget(&listWidget);
...
mainWidget.show();
return app.exec();
}
class X : public QWidget {
QWidget plannerLeftDisplay;
QVBoxLayout plannerLeftLayout;
UASListWidget listWidget;
...
X(QWidget * parent = 0) : QWidget(parent),
plannerLeftLayout(&plannerLeftDisplay)
{
plannerLeftLayout.addWidget(&listWidget);
...
}
};