Russian Qt Forum
Сентябрь 30, 2024, 02:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget - правка элементов дерева и его количества  (Прочитано 6846 раз)
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]));
}
}

Буду благодарен за помощь....
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Февраль 25, 2009, 16:04 »

1) На каком уровне вложенности должна происходить "чистка"?
2) Почему k=j+1 ?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spirit
Гость
« Ответ #2 : Февраль 25, 2009, 16:21 »

вот тут QTreeWidgetItemIterator по идее должен помочь. Улыбающийся
Записан
AD
Гость
« Ответ #3 : Февраль 25, 2009, 16:24 »

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

Ау! Буду благодарен за помощь!
Записан
Makss
Гость
« Ответ #5 : Февраль 25, 2009, 22:06 »

удаляй не по индексу а по указателю, тем самым предостережёшь себя от кучи проблем
Записан
AD
Гость
« Ответ #6 : Февраль 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);
}
}
}
}
 
Записан
BRE
Гость
« Ответ #7 : Февраль 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.
Записан
spirit
Гость
« Ответ #8 : Февраль 27, 2009, 09:31 »

говорю ж итератор тут самое оно:
взяли первый айтем пробежались по дереву,
грухнули все повторяющиеся,
взяли второй айтем удалили все повторяющиеся и так пока не дошли до конца списка.
и вот тут как раз мощь итератора и приходит на помощь, т.к. проходится все дерево.
« Последнее редактирование: Февраль 27, 2009, 11:06 от spirit » Записан
AD
Гость
« Ответ #9 : Февраль 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 лучше! Улыбающийся
Записан
BRE
Гость
« Ответ #10 : Февраль 27, 2009, 11:01 »

СПАСИБО! Улыбающийся Помогло. Жаль у вас нельзя тут репутацию повышать! Этим crossplatform лучше! Улыбающийся
Просто у всех пользователей с данного сайта репутацию повышать уже некуда, такая она огромная.  Подмигивающий Смеющийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.095 секунд. Запросов: 23.