Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt布局的父级?_C++_Qt - Fatal编程技术网

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);
    ...
  }
};