Создаются виджеты раскрывающегося списка во многом так же, как и другие виджеты. Главная новая деталь — вызов функции insertStrList
для сохранения списка вариантов в виджете.
Как и в других содержащих текст виджетах, можно задать функцию, которая будет вызываться каждый раз при изменении значения или в общем случае текста раскрывающегося списка.
Списки и деревья в комплекте Qt формируются виджетом QListView
. Этот виджет представляет как простые списки, так и иерархические данные, разделенные на строки и столбцы. Он очень подходит для вывода структур каталогов или чего-то подобного, потому что дочерние элементы можно раскрыть и свернуть, щелкнув кнопкой мыши знак "плюс" или "минус", так же как в файловом обозревателе.
В отличие от виджета GTK+ ListView
виджет QListView
обрабатывает и данные, и их представление, что сделано для облегчения использования, если не для исключительной гибкости.
В виджете QListView
можно выбрать строки или отдельные ячейки и затем вырезать и вставить данные, отсортировать их по столбцу и вы получите виджеты QCheckBox
, отображенные в ячейках. В этот виджет встроено множество функциональных возможностей — как программисту вам достаточно лишь вставить данные и задать некоторые правила форматирования.
Создается виджет QListView
обычным образом, заданием родительского виджета и собственного имени виджета:
QListView *view = new QListView(parent, "name");
Для задания заголовков столбцов используйте соответствующим образом названный метод addColumn
:
view->addColumn("Left Column", width1); // фиксированной ширины
view->addColumn("Right Column"); // с автоматически задаваемым размером
Ширина столбца задается в пикселах или, если пропущена, приравнивается к величине самого длинного элемента в столбце. В дальнейшем при вставке и удалении элементов ширина столбца автоматически меняется.
Данные вставляются в QListView
с помощью объекта QListViewItem
, представляющего строку данных. Вы должны лишь передать в конструктор объект QListView
и элементы строки, и она добавится в конец представления:
QListViewItem *toplevel = new QListViewItem(view, "Left Data", "Right Data");
Первый параметр — либо объект QListView
, как в данном случае, либо еще один объект типа QListViewItem
. Если передается QListViewItem
, строка создается как дочерняя по отношению к этому объекту QListViewItem
. Таким образом, структура дерева формируется передачей объекта QListView
для узлов верхнего уровня и затем последующих объектов типа QListViewItem
для дочерних или подчиненных узлов.
Остальные параметры — данные каждого столбца, по умолчанию равные NULL
, если не заданы.
Добавление дочернего узла — это просто вариант передачи в функцию указателя верхнего уровня. Если вы не добавляете последующие дочерние узлы в объект QListViewItem
, нет необходимости сохранять возвращаемый указатель:
new QListViewItem(toplevel, "Left Data", "Right Data");
// Дочерний по отношению к верхнему уровню
В API QListViewItem
можно найти методы обхода узлов дерева на случай корректировки конкретных строк:
#include
virtual void insertItem(QListviewitem* newChild);
virtual void setText(int column, const QString& text);
virtual QString text(int column) const;
QListViewItem* firstChild() const;
QListViewItem* nextSibling() const;
QListViewItem* parent() const;
QListViewItem* itemAbove();
QListViewItem *itemBelow();
Получить первую строку в дереве можно, вызвав метод firstChild
для самого объекта QListView
. Затем можно многократно вызывать firstChild
и nextSibling
для возврата фрагментов или целого дерева.
Приведенный далее фрагмент программного кода выводит первый столбец всех узлов верхнего уровня:
QListViewItem *child = view->firstChild();
while(child) {
cout << myChild->text(1) << "\n";
myChild = myChild->nextSibling();
}
Все подробности, касающиеся QListView
, QListViewItem
и QCheckListView
, см. в документации API комплекта Qt.
Выполните упражнение 17.7.
QListView