QT 布局一般分为手动布局和自动布局(用布局管理器)。
手动布局就是自己设置每个控件的大小,以及界面的大小,能非常确定每个界面的大小状态,好处就是简单,布局紧凑,可控性高。
自动布局就是用布局管理器自动管理布局,可控性不是特别高,特别是在一个很大的界面中显示一个很小或者不能不满界面的时候,这个时候布局显得格外重要,布局处理不好的话,界面看起来一点都不协调,而且很难令人接受。
自动布局设计的一些技巧:
void setContentsMargins(int left, int top, int right, int bottom);
//设置布局内部四边的空隙
newLayout->setContentsMargins(0,0,50,0);
当一个很小的控件或者嵌入界面在一个很大的界面上时,我们就可以通过控制小界面在大界面位置上的 上下左右 来控制界面布局。
newLayout->setAlignment(Qt::AlignHCenter);
newLayout->setAlignment(Qt::AlignVCenter);
也可以设置小界面在大界面中的何处,居中、置顶、靠右........
下面是AlignmentFlag 枚举定义:
enum AlignmentFlag {
AlignLeft = 0x0001,
AlignLeading = AlignLeft,
AlignRight = 0x0002,
AlignTrailing = AlignRight,
AlignHCenter = 0x0004,
AlignJustify = 0x0008,
AlignAbsolute = 0x0010,
AlignHorizontal_Mask = AlignLeft | AlignRight | AlignHCenter | AlignJustify | AlignAbsolute,
AlignTop = 0x0020,
AlignBottom = 0x0040,
AlignVCenter = 0x0080,
AlignVertical_Mask = AlignTop | AlignBottom | AlignVCenter,
AlignCenter = AlignVCenter | AlignHCenter
这样如果还解决不了问题的话,就用QSpacerItem ,
QSpacerItem *horizontalSpacer3 = new QSpacerItem(166346, 166346, QSizePolicy::Expanding, QSizePolicy::Expanding);
根据需求自己定义初始化大小。
还有一种情况,就在是一个布局管理器中有好多控件,但是想控制每个控件所占用的大小,而且又不能写死每个控件的大小(方便最大化或者改变整个界面显示的时候),比如:
QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->setMargin(0);
leftLayout->addWidget(ui->webView);
leftLayout->addWidget(ui->onvifWidget);
leftLayout->addLayout(webOnvifBarLayout);
一个界面中有三个界面组成,这个时候就用
leftLayout->setStretch(0,30);
leftLayout->setStretch(1,30);
leftLayout->setStretch(2,1);
来设置每个界面所占用的比例。