在我们进行应用程序开发时,流式布局是很常见 的一种布局。Qt中自带的布局并没有实现流式布局,因此我们需要自己实现。写之前看了网上几篇流式布局的博客,感觉实现的比较麻烦,代码不够简洁,不太能满足博主的需要,于是决定自己实现,本篇博客中实现的流式布局应该是全网代码量最少的流式布局了,代码比较简单,但是效果还是不错的。
博主在项目中实现的效果如下图所示:
思路比较简单:
利用栅格布局和scrollArea,子窗体放在栅格布局中,将栅格布局放入scrollArea,每当窗体大小改变时,重新计算scrollArea每行能放几个子窗体,然后利用addWidget()对栅格布局中的子窗体进行重新排列即可。
代码如下:
template <typename equ_type>
void UIDemo01::set_flow_layout(int width,int height,int equ_width,QList<equ_type*> equ_list,QGridLayout *gri_lay)
{
int col_cnt=width/equ_width;
int row_cnt=0;
if(!col_cnt) return;
if(!equ_list.size()) return; //当前无设备 return
int MAX_HEIGHT=320;
int min_row=height/MAX_HEIGHT+1;
//如果有余数就加一,没余数就直接等于除的结果
if(equ_list.size()%col_cnt)
row_cnt=equ_list.size()/col_cnt+1;
else row_cnt=equ_list.size()/col_cnt;
if(row_cnt<min_row) row_cnt=min_row;
for(int i=0;i<row_cnt;i++)
{
for(int j=0;j<col_cnt;j++)
{
if(col_cnt*i+j<equ_list.size())
gri_lay->addWidget(equ_list.at(col_cnt*i+j),i,j,Qt::AlignLeft | Qt::AlignTop);
}
//gri_lay->setColumnStretch(i,1);
}
}
//窗体大小改变发出的事件
void UIDemo01::resizeEvent(QResizeEvent *event)
{
this->set_flow_layout(ui->scrollArea->width(),ui->scrollArea->height(),EQU_WIDTH,equ_list,gri_lay);
}
其中QList<equ_type*> equ_list是存放子窗体的容器,EQU_WIDTH为子窗口的宽度大小。