2012-10-30 105 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