На этом шаге рассмотрим класс 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 и рассмотрим установку кнопки флажка для элементов иерархического списка.