На этом шаге рассмотрим множественный выбор элементов виджета класса QTreeWidget.
По умолчанию пользователь может одновременно выбирать из списка только один из элементов. Если этого недостаточно, то нужно вызвать метод setSelectionMode() базового класса QAbstractItemView с параметром QAbstractItemView::MultiSelection, что устанавливает режим множественного выделения.
Для того чтобы "пройтись" по всем элементам виджета иерархического списка QTreeWidget, можно воспользоваться итератором, например:
QTreeWidgetItemIterator it(lwg, QTreeWidgetItemIterator::Selected);
В первом параметре в конструктор итератора был передан адрес самого виджета иерархического списка. Вторым параметром передается флаг, указывающий, какие виджеты должны приниматься во внимание при обходе. В нашем конкретном случае мы передали значение QTreeWidgetItemIterator::Selected, что осуществит обход выделенных элементов иерархического списка. Для обхода всех элементов в конструктор нужно передать значение QTreeWidgetItemIterator::All. Есть и другие флаги, их полный список можно посмотреть в документации.
Для иллюстрации множественного выбора, рассмотрим пример приложения, показанного на рис.1
Рис.1. Пример множественного выбора
Для реализации этого приложения в пример из предыдущего шага были внесены следующие изменения и дополнения. В конструтор класса tw добавим строку:
lwg->setSelectionMode(QAbstractItemView::MultiSelection);
В функцию viviod():
//kol - суммарный размер выбранных папок в MB //n - размер выбранной папки int kol=0,n; QString s; l->setText("Выбраны папки: \n"); //объявили итератор для обхода всех выбранных эелементов списка QTreeWidgetItemIterator it(lwg, QTreeWidgetItemIterator::Selected); while (*it) { //сохранили надпись второго столбца в переменной s s=(*it)->text(1); //удалили "MB" из надписи s=s.replace("MB",""); //переводим оставшуюся часть надписи в целое число n=s.toInt(); //прибавляем значение к переменной kol kol+=n; //вывод соответствующей строки l->setText(l->text()+"Папка: "+(*it)->text(0)+" Размер: "+(*it)->text(1)+"\n"); //переходим к следующему выделенному элементу списка it++; } //конвертируем значение переменной kol в строковое s=QString::number(kol); //выводим суммарный размер выбранных элементов l->setText(l->text()+"Суммарный размер: "+s+"MB");
Файлы приложения можно взять здесь.
На следующем шаге продолжим знакомство с классом QTreeWidget и рассмотрим технологию перетаскивания.