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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QListViewItemIterator зацикливается  (Прочитано 2377 раз)
cresta
Гость
« : Август 23, 2007, 21:56 »

Есть листвью. В нем root-итемы (заголовки категорий). По названию каждого root-итема делаю запрос к базе данных, и все результаты запроса добавляю к этому root-итему как child итемы.
Т.е. список категорий и в каждой категории свой список товаров.

Код:
		QListViewItemIterator it( categoryView );
while ( it.current() ) {
// it.current() - это root итем, к которому добавляю child'ов
bool parity = TRUE;
strCat = it.current()->text(0); // текст root'a - название категории товаров.
query.prepare("SELECT code, product, outprice, count FROM `table1` WHERE category = '" +strCat+ "' ORDER BY product");
query.exec();
lastItem = 0;
// пока есть товары в категории, добавляю результаты запроса как child итемы к root'у.
while ( query.next() ) {
item = new ListItem( (ListItem*)it.current(), lastItem, parity );
item->setText( 1, query.value(0).toString() );
item->setText( 2, query.value(1).toString() );
parity = !parity;
lastItem = item;
}
//item = new ListItem( (ListItem*)it.current(), lastItem, TRUE );
//item->setText( 1, "  " );
++it;
}

Всё хорошо, список категорий и список товаров в каждой категории формируется, как и задумано.

Теперь для того, чтобы визуально отделить одну категорию товаров от другой, решил в конце каждой категории (группы child'ов) вставить пустой итем как разделитель.
Это те две строки, которые закомментированы. Вроде всё правильно, после добавления всех результатов запроса к текущему root'у (it.current()) добавляю пустой child.
Однако при этом цикл while ( it.current() ) превращается в бесконечный. Программа не выходит из этого цикла.
При этом указатель it.current()  все время разный (нарастает).
Почему?

« Последнее редактирование: Август 23, 2007, 21:58 от cresta » Записан
cresta
Гость
« Ответ #1 : Август 24, 2007, 01:38 »

Идиотская логика QListViewItemIterator'а  Веселый
Он включает в список итерируемых итемов и те итемы, которые были добавлены в процессе итерации, т.е после создания экземпляра QListViewItemIterator.
Соответственно, пытается лепить итемы-разделители друг на друга, а не к последнему child-итему в категории.
Попутно выполняется огромное количество пустых запросов к базе данных...

Пришлось делать так:

Код:
		QListViewItemIterator it( categoryView );
while ( it.current() ) {
bool parity = TRUE;
strCat = it.current()->text(0);
if ( strCat.stripWhiteSpace() != "" ){
query.prepare("SELECT code, product, outprice, count FROM `table1` WHERE category = '" +strCat+ "' ORDER BY product");
query.exec();
lastItem = 0;
while ( query.next() ) {
item = new ListItem( (ListItem*)it.current(), lastItem, parity );
item->setText( 1, query.value(0).toString() );
item->setText( 2, query.value(1).toString() );
parity = !parity;
lastItem = item;
}
//categories splitter
if ( lastItem ) item = new ListItem( (ListItem*)it.current(), lastItem, TRUE );
}
++it;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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