На этом шаге рассмотрим класс QTreeWidget.
Виджет QTreeWidget отображает элементы списка в иерархической форме и поддерживает возможность выбора пользователем одного или нескольких из них.
Его часто применяют для показа содержимого дисков и каталогов. В случае, когда область отображения не в состоянии разместить все элементы, появляются полосы прокрутки.
Элементы списка являются объектами класса QTreeWidgetItem и предоставляют возможность отображать несколько столбцов с данными. Класс QTreeWidgetItem содержит конструктор копирования и метод clone() для создания копий элементов.
При помощи методов addChildren() и insertChildren() можно добавлять и вставлять сразу несколько элементов.
Если необходимо снабдить элементы небольшими растровыми изображениями, то они устанавливаются с помощью метода QTreeWidgetItem::setIcon(), а текст элемента — с помощью QTreeWidgetItem::setText(). Первый параметр обоих методов соответствует номеру столбца.
На рис. 1 список содержит три элемента. Двойной щелчок мыши на элементе Локальный диск (C) сворачивает и разворачивает вложенные элементы (папки).

Рис.1. Пример иерархического списка
Для реализации этого приложения объявлен класс tw:
class tw:public QWidget
{
Q_OBJECT
private:
QStringList lst;
QTreeWidget *lwg;
QLabel *l;
QTreeWidgetItem* pitem,*t,*curitem;
public:
tw(QWidget *parent=0);
private slots:
void vivod();
};Приведем текст конструктора класса tw:
tw::tw(QWidget *p):QWidget (p)
{ //создали виджет иерархического списка
lwg=new QTreeWidget(this);
//создали виджет надписи
l=new QLabel("Папка: ");
//заполнили список строк элементами
lst << "Папка" << "Размер";
//метод setHeaderLabels() задает заголовки столбцов
lwg->setHeaderLabels(lst);
//включили сортировку списка
lwg->setSortingEnabled(true);
//в конструктор объекта первого элемента
//передается адрес виджета списка.
//Этот элемент является предком для создаваемых в
//дальнейшем элементов и представляет собой вершину
//иерархии
pitem = new QTreeWidgetItem(lwg);
pitem->setText(0, "Локальный диск (C)");
pitem->setIcon(0, QPixmap("drive.bmp"));
t = 0;
int j=0;
//в цикле создается 15 потомков для вершины списка
for (int i = 1; i < 15; ++i)
{
t = new QTreeWidgetItem(pitem);
t->setText(0, "Папка " + QString::number(i));
//при помощи метода setText() задается текст столбцов
t->setText(1, QString::number(i) + "MB");
//метод setIcon() добавляет к первому столбцу растровое изображение
t->setIcon(0, QPixmap("folder.bmp"));
if(j==0)
{ //сохранили указатель на первый элемент списка
j++;
curitem=t;
}
}
//метод setItemExpanded() разворачивает элемент вершины
//и показывает иерархию элементов
lwg->setItemExpanded(pitem, true);
//установили в качестве текущего первый созданный элемент (Папка 1)
lwg->setCurrentItem(curitem);
//в виджет надписи добавили текст первого (Папка) и
//второго (Размер) столбцов иерархического списка
l->setText(l->text()+curitem->text(0)+" Размер: "+curitem->text(1));
//при выборе нового элемента иерархического
//списка выполняется стот vivod()
connect(lwg,SIGNAL(itemSelectionChanged()),this,SLOT(vivod()));
QVBoxLayout *pvbl=new QVBoxLayout;
pvbl->setMargin(5);
pvbl->setSpacing(15);
pvbl->addWidget(lwg);
pvbl->addWidget(l);
setLayout(pvbl);
}Слот vivod() выводит название и размер выбранного элемента иерархического списка в виджете надписи:
t=lwg->currentItem();
l->setText("Папка: "+t->text(0)+" Размер: "+t->text(1));Файлы приложения можно взять здесь.
Обратите внимание на столбцы, они предоставляют намного больше возможностей, чем просто указание заголовка. При нажатии на заголовок столбца проводится сортировка элементов в убывающем или возрастающем порядке. Подобную сортировку можно разрешить или запретить, вызвав метод setSortingEnabled(). Для разрешения нужно передать в этот метод значение true, а для запрещения — false.
Класс QTreeWidget содержит следующие сигналы:
Второй параметр последних трех сигналов содержит номер столбца, на котором произошел щелчок.
На следующем шаге продолжим знакомство с классом QTreeWidget и рассмотрим установку кнопки флажка для элементов иерархического списка.