2012-01-07 2 views
2

Как я неоднократно публиковал несколько месяцев за последние несколько месяцев, я пишу приложение журнала/дневника в Qt. Записи сортируются в QTreeWidget по годам, месяцам, дням и записи (по умолчанию конфигурация сортирует записи по дням) или по годам, месяцам и записи (где все записи из того же месяца сгруппированы вместе)Итерация через узлы QTreeWidget

Запись узлы имеют два столбца: первый вид виден и содержит имя записи. Второй столбец невидим и содержит номер строки соответствующей записи в базе данных. Когда эта запись выбрана, программа выполняет запрос выбора на основе этого номера строки и отображает содержимое. Корень, год, месяц, (и день, если включено) узлы также имеют второй столбец, но номер строки на них всегда равен -1. (действительный счетчик строк начинается с 0)

Панель инструментов журнала уже имеет кнопки назад и вперед, что позволяет пользователю просматривать следующую и предыдущую записи. Хотя эта функция уже работает, текущий выбранный элемент в дереве не изменяется вместе с ним, и это то, что я пытаюсь исправить.

Я решил, что лучший способ сделать это - это функция цикла, которая сканирует значения второго скрытого столбца каждого, пока не будет найден правильный номер строки. Каждый щелчок кнопок назад/вперед вызовет эту функцию снова, чтобы выбранный узел всегда соответствовал текущей записи, просматриваемой, как только я получу эту работу.

Недостатком является то, что этот метод может быть медленным, если база данных становится огромной, но я не могу с этим поделать. Пользователь может удалять записи или перетасовывать их, поэтому просто полагаться на rownumber ++ или rownumber - может вызвать проблемы. Поскольку база данных не заполняет недостающие номера строк, а просто переходит к следующему, могут возникнуть проблемы, если программа всегда предполагает, что каждая строка, когда-либо сделанная в базе данных, все еще существует в любой момент времени.

Мой вопрос: как я сканирую конкретный столбец каждого узла в QTreeWidget?

ответ

12

Перебор всех элементов может быть сделано с:

QTreeWidgetItemIterator it(treewidget); 
while (*it) { 
    if ((*it)->text(column_number)=="searched") 
    break; 
    ++it; 
} 

но возможно QTreeWiget :: findItems() является то, что вам нужно.

Также посмотрите на QStandardItem :: data(), это лучший способ хранения скрытых данных по каждому элементу по сравнению со скрытым столбцом.

+0

Это сработало (с небольшими изменениями) Спасибо! –

+0

QTreeWidgetItemIterator it (treeWidget); while (* it) { if ((* it) -> текст (0) == itemText) (* it) -> setSelected (true); ++ it; } – ufukgun

+0

Действительно полезно! – Jatin

Смежные вопросы