|
Qt中布局管理器是十分好用的,简直是懒人最佳搭档!但是当界面控件需要根据实时数据进行增删时,往往不得其法,在这里列一下布局上控件的增删,已备后续使用。
1.遍历水平/垂直布局内控件
for(int col =2; col< ui->horizontalLayout->count() -1; col++)
{
QLayoutItem *Item = ui->horizontalLayout->itemAt(col);
if(Item)
{
QCheckBox *checkbox = qobject_cast<QCheckBox*>(Item->widget());
……
}
}
}
2.遍历栅格布局内控件
for(int row =0; row< ui->gridLayout->rowCount(); row++)//行
{
for(int col =2; col< ui->gridLayout->columnCount() -1; col++)
{//列
QLayoutItem *Item = ui->gridLayout->itemAtPosition(row,col);
if(Item)
{
QCheckBox *checkbox = qobject_cast<QCheckBox*>(Item->widget());
……
}
}
}
}
3.移除布局中所有控件,并保存
QVector<QCheckBox*> vecBox;
int rowCount = ui->gridLayout->rowCount();
int colCount = ui->gridLayout->columnCount();
for(int row =0; row< ui->gridLayout->rowCount(); row++)
{//获取所有checkbox并移除
for(int col =2; col< ui->gridLayout->columnCount() -1; col++)
{//遍历所有行第二列开始所有控件,具体内容可根据实际界面确定
QLayoutItem *Item = ui->gridLayout->itemAtPosition(row,col);
if(Item)
{
QCheckBox *checkbox = qobject_cast<QCheckBox*>(Item->widget());
vecBox.push_back(checkbox);//控件保存
ui->gridLayout->takeAt(ui->gridLayout->indexOf(checkbox));//移除
//注意:此处移除操作不是实际删除,若要直接删除需要手动delete
}
}
}
//…… 处理vecDev
4.向布局内动态添加控件
QMap<QString,QToolButton*>::iterator it = m_mapBtn.begin();
while(it != m_mapBtn.end())
{
ui->gridLayout->addWidget(it.value(),row,col++);
if(col%4 == 0)//每行四列按钮
{
row++;
col = 0;
}
it++;
}
|