Qt中的布局管理器

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类的布局管理体系中。

猜你喜欢

转载自blog.csdn.net/wangtingze123/article/details/84648921