У меня есть фрагмент кода, который делает это: метод с именем prepareUI
делает пользовательский интерфейс готовым к загрузке результатов поиска, которые в него подаются. Метод с именем onClear
, который вызывается, когда уже отображаемые результаты необходимо очистить. И метод с именем populateSearchResults
, который берет данные поиска и загружает их в пользовательский интерфейс. Контейнер, в котором хранятся данные, является общедоступным указателем, поскольку он необходим для очистки результатов от onClear
:
void MyClass::prepareSearchUI() {
//there may be many search results, hence need a scroll view to hold them
fResultsViewBox = new QScrollArea(this);
fResultsViewBox->setGeometry(28,169,224,232);
fSearchResultsLayout = new QGridLayout();
}
void MyClass::onClear() {
//I have tried this, this causes the problem, even though it clears the data correctly
delete fSearchResultContainer;
//tried this, does nothing
QLayoutItem *child;
while ((child = fSearchResultsLayout->takeAt(0)) != 0) {
...
delete child;
}
}
void MyClass::populateWithSearchesults(std::vector<std::string> &aSearchItems) {
fSearchResultContainer = new QWidget();
fSearchResultContainer->setLayout(fSearchResultsLayout);
for (int rowNum = 0; rowNum < aSearchItems.size(); rowNum++) {
QHBoxLayout *row = new QHBoxLayout();
//populate the row with some widgets, all allocated through 'new', without specifying any parent, like
QPushButton *loc = new QPushButton("Foo");
row->addWidget(loc);
fSearchResultsLayout->addLayout(row, rowNum, 0,1,2);
}
fResultsViewBox->setWidget(fSearchResultContainer);
}
Проблема в том, что когда я вызываю onClear
, который внутренне вызывает delete
, он удаляет все отображаемые результаты. Но после этого, если я снова вызову populateWithSearchesults
, мое приложение выйдет из строя, и трассировка стека покажет, где этот метод дал сбой.
Как решить эту проблему?