Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: AD от Февраль 25, 2009, 15:42



Название: QTreeWidget - правка элементов дерева и его количества
Отправлено: AD от Февраль 25, 2009, 15:42
Вот код, который проходит по всем элементам и ищет повторяющиеся. Индексы этих элементов запоминает, а затем чистит их. Но, тут непонятная штука вылезла. Что чистит не все повторяющиеся, а только некоторые, хотя заполнение списка идет правильно. Ну то есть, было 5 повторяющихся элементов, осталось 2. Почему так???? Вот код этой штуковины.
Код
C++ (Qt)
/// Правка дерева этапов полета
void TLV::editTreeView()
{
QTreeWidgetItem* header = treePhaseView -> topLevelItem(0);
QTreeWidgetItem *phaseNode = 0, *fileNode = 0, *revFileNode = 0;
for(register int i=0; i<header -> childCount(); ++i)
{
phaseNode = header -> child(i);
if(phaseNode == 0) break;
string ph(phaseNode -> text(0).toStdString());
QList<int> indexList;
for(register int j=0; j<phaseNode -> childCount(); ++j)
{
fileNode = phaseNode -> child(j);
if(fileNode == 0) break;
string sj(fileNode -> text(0).toStdString());
for(register int k=j+1; k<phaseNode -> childCount(); ++k)
{
revFileNode = phaseNode -> child(k);
if(revFileNode == 0) break;
string pj(revFileNode -> text(0).toStdString());
if(revFileNode -> text(0) == fileNode -> text(0))
indexList.append(k);
}
}
for(register int j=0; j<indexList.size(); ++j)
phaseNode -> removeChild(phaseNode -> child(indexList[j]));
}
}

Буду благодарен за помощь....


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: pastor от Февраль 25, 2009, 16:04
1) На каком уровне вложенности должна происходить "чистка"?
2) Почему k=j+1 ?


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: spirit от Февраль 25, 2009, 16:21
вот тут QTreeWidgetItemIterator по идее должен помочь. :)


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: AD от Февраль 25, 2009, 16:24
Цитата: pastor
1) На каком уровне вложенности должна происходить "чистка"?
2) Почему k=j+1 ?
1) На 3-ем уровне должна производиться чистка.
2) Эти два цикла бегут по одному и тому же массиву. k-ый элемент - это след. элемент за j-ым. Пытался сделать, чтобы второй цикл бежал с конца, но при дебаге во 2 цикл даже не заходил, почему-то!


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: AD от Февраль 25, 2009, 21:55
Ау! Буду благодарен за помощь!


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: Makss от Февраль 25, 2009, 22:06
удаляй не по индексу а по указателю, тем самым предостережёшь себя от кучи проблем


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: AD от Февраль 27, 2009, 09:07
Теперь этот метод выглядит так, но от глюка еще не избавлен!
Код
C++ (Qt)
/// Правка дерева этапов полета
void TreeModel::editTreeModel()
{
QStandardItem* header = model -> item(0);
QStandardItem *phaseNode = 0, *fileNode = 0, *revFileNode = 0;
for(register int i=0; i<header -> rowCount(); ++i)
{
phaseNode = header -> child(i);
if(phaseNode == 0) break;
string ph(phaseNode -> text().toStdString());
for(register int j=0; j<phaseNode -> rowCount(); ++j)
{
fileNode = phaseNode -> child(j);
if(fileNode == 0) break;
string sj(fileNode -> text().toStdString());
for(register int k=j+1; k<phaseNode -> rowCount(); ++k)
{
revFileNode = phaseNode -> child(k);
if(revFileNode == 0) break;
string pj(revFileNode -> text().toStdString());
if(revFileNode -> text() == fileNode -> text())
phaseNode -> removeRow(k);
}
}
}
}
 


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: BRE от Февраль 27, 2009, 09:26
Вот смотри:

Индекс : Значение
----------------------
0           AAA             <- j = 0
1           AAA             <- k = 1
2           AAA
3           BBB
4           CCC

Убрали элемент с индексом 1.

После этого:
Индекс : Значение
----------------------
0           AAA          <- j = 0
1           AAA
2           BBB          <- k = 2
3           CCC

Вот и происходит пропуск второго AAA.


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: spirit от Февраль 27, 2009, 09:31
говорю ж итератор тут самое оно:
взяли первый айтем пробежались по дереву,
грухнули все повторяющиеся,
взяли второй айтем удалили все повторяющиеся и так пока не дошли до конца списка.
и вот тут как раз мощь итератора и приходит на помощь, т.к. проходится все дерево.


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: AD от Февраль 27, 2009, 10:19
Вот смотри:

Индекс : Значение
----------------------
0           AAA             <- j = 0
1           AAA             <- k = 1
2           AAA
3           BBB
4           CCC

Убрали элемент с индексом 1.

После этого:
Индекс : Значение
----------------------
0           AAA          <- j = 0
1           AAA
2           BBB          <- k = 2
3           CCC

Вот и происходит пропуск второго AAA.
СПАСИБО! :) Помогло. Жаль у вас нельзя тут репутацию повышать! Этим crossplatform лучше! :)


Название: Re: QTreeWidget - правка элементов дерева и его количества
Отправлено: BRE от Февраль 27, 2009, 11:01
СПАСИБО! :) Помогло. Жаль у вас нельзя тут репутацию повышать! Этим crossplatform лучше! :)
Просто у всех пользователей с данного сайта репутацию повышать уже некуда, такая она огромная.  ;) ;D