2012-10-30 77 views
0

我正在从定时器执行的xml中加载数据。 xml被解析并填充到实体对象中。 在一个循环中,从实体对象获取数据并填充QCommandLinkBut​​ton's。最后一批按钮被设置在verticalLayout中,然后在scrollArea中。空滚动区域QT C++

但每次加载数据时都会附加到旧数据。如何在重新填充scrollArea之前清空srollArea的内容。

MainWindow::methodExecudedByTimer(){ 

    foreach(int i, map.keys()){ 
     QCommandLinkButton* buttonEmail = new QCommandLinkButton(this); 
     Email em = map[i]; 
     buttonEmail->setText(em.__toString()); 

     ui->verticalLayout->addWidget(buttonEmail); 
    } 
    ui->scrollArea->setLayout(ui->verticalLayout); 
} 

回答

0

我发现在互联网深处的答案。

foreach之前,我补充这一点:

qDebug() << "check if layout filled"; 
if(ui->verticalLayout->count() > 0){ 
    qDebug() << "empty layout"; 
    QLayoutItem *item = NULL; 
    while ((item = ui->verticalLayout->takeAt(0)) != 0) { 
     delete item->widget(); 
    } 
}else{ 
    // on app first run 
    qDebug() << "layout empty"; 
} 
1

可以使用setWidget更换setLayout的。而当时的新的数据来了,你可以叫takeWidget来删除旧数据。 的MainWindow :: methodExecudedByTimer(){

foreach(int i, map.keys()){ 
    QCommandLinkButton* buttonEmail = new QCommandLinkButton(this); 
    Email em = map[i]; 
    buttonEmail->setText(em.__toString()); 

    ui->verticalLayout->addWidget(buttonEmail); 
} 
ui->scrollArea->takeWidget(); 
QWidget *widget = new QWidget(); 
QSize size = ui->scrollArea->size(); 
widget->setMinimumSize(size.width(),size.height()); 
widget->setLayout(ui->verticalLayout); 
ui->scrollArea->setWidget(widget); 

}

+0

这是实际添加的东西,如果卡斯帕黑博士打算与回答唯一的答案,他应该标明这是重复的,因为这是一个重复回答。 – snb