0

タイマーによって実行されたxmlからデータをロードしています。xmlは解析され、エンティティオブジェクトに入力されます。ループでは、エンティティオブジェクトからデータを取得し、QCommandLinkBut​​tonにデータを入力します。そして最後に、ボタンのバッチがverticalLayoutに設定され、次にscrollAreaに設定されます。

ただし、データがロードされるたびに、古いデータに追加されます。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);
}
4

2 に答える 2

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);

}

于 2012-10-31T01:52:55.213 に答える
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";
}
于 2012-10-31T21:35:21.307 に答える