728x90

보통 QTreeWidget에서 아이템을 싹 비우려고 할 때 Clear() 함수를 많이 사용합니다. 하지만 이 함수의 경우 QTreeWidget에 가지고 있는 아이템들의 메모리를 해제시키기 때문에 아래와 같이 아이템을 다시 불러오려고 할 때 문제가 생기게 됩니다.

class Test {
    Test(uchar nItemCount) {
    	for ( int i=0; i < nItemCount; i++ ) {
    		QTreeWidgetItem* it = new QTreeWidgetItem;
        	items.append(it);
        }
    }
    QList<QTreeWidgetItem*> getItems() { return Items; }
    
	QList<QTreeWidgetItem*> Items;
};

int main() {
    Test* t1 = new Test(3);
    Test* t2 = new Test(10);
    
    auto items = t1->getItems();
    for ( auto i : items ) {
    	ui->tree->addTopLevelCount(i);
    }
    
    ui->tree->clear();		// t1이 갖고 있는 item들 delete 됨
    
    auto items = t2->getItems();
    for ( auto i : items ) {
    	ui->tree->addTopLevelCount(i);
    }
    
    ui->tree->clear();		// t2이 갖고 있는 item들 delete 됨
    
    auto items = t1->getItems();
    for ( auto i : items ) {
    	ui->tree->addTopLevelCount(i);		// i는 쓰레기 값
    }
    
    ...
}

이럴때는 clear를 사용하는 것이 아닌 takeTopLevelItem을 통해 단순히 트리에서 제거해주면 됩니다.

while (topLevelItemCount() > 0) {
    takeTopLevelItem(0);
} // clear but not delete items
728x90

+ Recent posts