https://blog.csdn.net/qq_29344757/article/details/77949119
https://blog.csdn.net/u014252478/article/details/79924887
https://blog.csdn.net/colorant/article/details/5367376
1、
QVBoxLayout *vb = new QVBoxLayout; //一定要动态分配
setLayout(vb);//将当前widget交付布局管理器vb管理 setLayout(vb);
布局管理器对象的生成必须动态分配,若在栈中生成,那么该函数退出后布局对象将被销毁,布局效果将失效。另外动态生成的布局对象并不需要程序员代码实现销毁。将Widget交付布局管理器托管后,管理器的父类对象即为widget,在父类Widget对象销毁后,会自动销毁Widget对象的所有子类,包括动态生成的布局管理器。
可以在上面VBoxLayout()函数中打印管理器对象的父对象的地址,该地址地位windget对象的地址,即this指针:
qDebug() << this;
qDebug() << vb->parent();
运行后:
2、布局就是管理控件的位置和尺寸。
在GTK中,Layout和Widget并没有截然分开,不存在单独的Layout类,每个控件都要自己负责管理自己的子控件的布局,只不过有些控件管理的多些,或者基本上专门用来管理布局,而有些则管理的少一些。
而在QT中,Layout和Widget是相对独立的类,但是Layout本身单独存在并没有意义,需要和Widget配合使用。而Widget本身不负责子控件的布局管理。你可以认为,Layout类其实只是一组预先撰写好的代码,在父控件尺寸变化时,根据预设参数和子控件的各种Geometry hint,管理控件的位置和尺寸。
不过,也有一些例外,比如QMainWindow类,就自己管理预设的子控件的布局。
3、 一点内部逻辑
*Layout如何管理Widget,层次关系**
首先是要通过QWidget::setLayout函数,这一步实际也将QWidge控件设置为QLayout类的父控件。而后,通常通过QLayout::addWidget()等函数,将widget添加到Layout类的布局管理体系中。