虽然标准布局可以帮助我们解决很多问题,但是有时候需要一些特殊的布局管理器来管理控件,所以我们需要制作一个自定义布局。
本节小豆君就来给大家分享如何自定义布局管理器,并且通过自己定义的布局管理器来了解布局的内部是如何工作的。
打开标准布局的头文件(QVBoxLayout,QHBoxLayout等),你会发现它们都直接或间接继承于QLayout,自然的,自定义布局也要继承QLayout。
QLayout继承于QObject和QLayoutItem,QLayoutItem是一个抽象类。
一般的,在继承类中,我们重点要关注这个基类中的虚函数,下面列出了QLayout的虚函数:
//添加一个QLayoutItem,当调用addWidget时,也会调用此函数
//在布局中,每添加一个控件,就会相应的增加一个QLayoutItem,
//用来管理每个控件在布局中的大小策略
virtual void addItem(QLayoutItem *) = 0;
//用于计算每个子控件在父窗口中的位置和大小
virtual void setGeometry(const QRect&) Q_DECL_OVERRIDE;
//获取第index个QLayoutItem
virtual QLayoutItem *itemAt(int index) const = 0;
//出栈一个QLayoutItem,并且返回该QLayoutItem的指针
virtual QLayoutItem *takeAt(int index) = 0;
//返回QLayoutItem*的个数
virtual int count() const = 0;
//大小提示
//这个虚函数是属于QLayoutItem的接口
//关于大小提示的信息,可查看上一节标准布局管理器三中的布局原理
QSize sizeHint() const;
3.2.1 金字塔布局
这个布局会在第一行放置一个控件,第二行放置两个控件。。。以此类推。
效果图:
这是如何实现的呢,直接上代码。
新建项目CustomLayout,类名为CustomLayout,基类为QWidget,不需要创建ui文件
customlayout.h
#ifndef CUSTOMLAYOUT_H
#define CUSTOMLAYOUT_H
#include <QWidget>
class CustomLayout : public QWidget
{
Q_OBJECT
public:
CustomLayout(QWidget *parent = 0);
~CustomLayout();
};
#endif // CUSTOMLAYOUT_H
customlayout.cpp
#include <QLabel>
#include "customlayout.h"