Шаг 79.
Библиотека Qt.
Класс QTreeWidget

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




Предыдущий шаг Содержание Следующий шаг