问题引入:
在界面设计时,经常会出现多种显示方式:按钮在整个页面下居中显示;按钮在页面的偏右侧居中显示。针对如上需求,如何采用一种布局适应多种显示场景?
总结:Qt有一个很重要的控件—弹簧(spacer):弹簧在没有布局的窗口中是没有什么作用的,所以只有在layout中才能显现作用。弹簧分水平和垂直弹簧,两者除方向不同以外,其他均相同。
弹簧分为水平/垂直弹簧:QSpacerItem(Horizontal Spacer 、Vertical Spacer)。
#include
QSpacerItem(int w, int h, QSizePolicy::Policy hPolicy = QSizePolicy::Minimum, QSizePolicy::Policy vPolicy = QSizePolicy::Minimum);
备注:常用于初始化构造弹簧时,设置固定或可变大小的区域。
void changeSize(int w, int h, QSizePolicy::Policy hPolicy = QSizePolicy::Minimum, QSizePolicy::Policy vPolicy = QSizePolicy::Minimum);
备注:常用于动态改变弹簧的大小,设置大小变化及隐藏功能时使用。
/**************************隐藏 弹簧******************************/
ui->horizonSpacer->changeSize(0, 0);
/**************显示并改变 horizon 类型的 弹簧*********************/
ui->horizonSpacer->changeSize(20, 20, QSizePolicy::Expanding);
/**************显示并改变 vertical 类型的 弹簧********************/
ui->verticalSpacer->changeSize(20, 20, QSizePolicy::Preferred, QSizePolicy::Expanding);
1、在layout中嵌入一个固定的弹簧
void InitControls()
{
m_pCustomLayout = new QHBoxLayout; //创建水平布局
m_pCustomLayout->setContentMargins(0,0,0,0);
m_pCustomLayout->setSpacing(30);
//为水平布局左侧,添加固定长度120大小的弹簧
m_pLeftHorizonSpacer = new QSpacerItem(120,20,QSizePolicy::Fixed,QSizePolicy::Minimum);
m_pCustomLayout->addItem(m_pLeftHorizonSpacer);
m_pCustomLayout->addStretch(1); //均分布局(使按钮居中)
//btn_ok按钮
btn_ok = new QPustButton(this);
m_pCustomLayout->addWidget(btn_ok);
//btn_cancel按钮
btn_cancel = new QPushButton(this);
m_pCustomLayout->addWidget(btn_cancel);
m_pCustomLayout->addStretch(1); //均分布局(使按钮居中)
//将layout布局加入到界面中
setLayout(m_pCustomLayout);
}
2、提供外置接口,用于动态改变弹簧大小(改变大小或隐藏均可)
void SetCenterButtonStyle()
{
m_pLeftHorizonSpacer->changeSize(0, 0);
m_pCustomLayout->update();
}