Qt:Документация 4.3.2/model-view-convenience

Материал из Wiki.crossplatform.ru

Версия от 10:56, 29 января 2009; Root (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

Image:trolltech-logo.png

[Предыдущая: Классы делегатов ] [ Содержание ] [Следующая: Использование Drag and Drop с представлениями элементов ]

Содержание

[править] Удобные классы представления элементов

[править] Краткий обзор

Наряду с классами модель/представление, Qt 4 также включает стандартные виджеты, реализующие классические основанные на элементах контейнеры. Они ведут себя подобно классам представлений элементов Qt 3, но переписаны с целью производительности и удобства сопровождения для использования с базовым каркасом модель/представление. Старые классы представлений элементов все еще доступны в библиотеке совместимости (дополнительную информацию см. Руководство по портированию).

Основанные на элементах виджеты имеют имена, отражающие их назначение: QListWidget предоставляет список элементов, QTreeWidget отображает многоуровневую древовидную структуру, а QTableWidget предоставляет таблицу с ячейками. Каждый из этих классов наследует поведение класса QAbstractItemView, который реализует общее поведение выбора элементов и управления заголовками.

[править] Виджеты-cписки

Одноуровневые списки элементов обычно отображаются с помощью QListWidget и множества QListWidgetItem. Виджет-список создается тем же образом, что и любой другой виджет:

     QListWidget *listWidget = new QListWidget(this);

Элементы списка могут быть добавлены в виджет-список непосредственно при создании:

     new QListWidgetItem(tr("Sycamore"), listWidget);
     new QListWidgetItem(tr("Chestnut"), listWidget);
     new QListWidgetItem(tr("Mahogany"), listWidget);

Также они могут быть созданы без родительского виджета-списка и добавлены в список позже:

     QListWidgetItem *newItem = new QListWidgetItem;
     newItem->setText(itemText);
     listWidget->insertItem(row, newItem);

Каждый элемент списка может отображать текст и пиктограмму. При настройке внешнего вида элемента можно изменить цвет и шрифт, используемые для отрисовки текста. Всплывающие подсказки, текст панели состояния и подсказки "What's This?" легко настраиваются для того, чтобы гарантировать, что список органично впишется в приложение.

     newItem->setToolTip(toolTipText);
     newItem->setStatusTip(toolTipText);
     newItem->setWhatsThis(whatsThisText);

По умолчанию элементы списка отображаются в порядке их добавления в список. Списки элементов могут быть отсортированы по алфавиту или в обратном порядке в соответствии с критерием, указанным в Qt::SortOrder:

     listWidget->sortItems(Qt::AscendingOrder);
     listWidget->sortItems(Qt::DescendingOrder);

[править] Виджеты-деревья

Деревья или иерархические списки элементов предоставляются с помощью классов QTreeWidget и QTreeWidgetItem. Каждый элемент виджета-дерева может иметь свои собственные дочерние элементы и отображать данные в нескольких столбцах. Виджеты-деревья создаются точно также, как и другие виджеты:

     QTreeWidget *treeWidget = new QTreeWidget(this);

Прежде, чем добавлять элементы в виджет-дерево, должно быть установлено количество столбцов. Например, мы можем определить два столбца и создать текстовые метки для отображения заголовков наверху каждого столбца:

     treeWidget->setColumnCount(2);
     QStringList headers;
     headers << tr("Subject") << tr("Default");
     treeWidget->setHeaderLabels(headers);

Самый легкий способ настроить надписи для каждой секции состоит в создании списка строк. Для более сложных заголовков вы можете создать элемент дерева, оформить его и использовать в качестве заголовка виджета-дерева.

Элементы верхнего уровня виджета-дерева создаются с виджетом-деревом в качестве родителя. Они могут быть вставлены в произвольном порядке, или вы можете определить порядок, указав при создании элемента предшествующий элемент:

     QTreeWidgetItem *cities = new QTreeWidgetItem(treeWidget);
     cities->setText(0, tr("Cities"));
     QTreeWidgetItem *osloItem = new QTreeWidgetItem(cities);
     osloItem->setText(0, tr("Oslo"));
     osloItem->setText(1, tr("Yes"));
 
     QTreeWidgetItem *planets = new QTreeWidgetItem(treeWidget, cities);

Виджеты-деревья с элементами верхнего уровня обращаются несколько иначе, чем с элементами, находящимися в глубине иерархии. Элементы верхнего уровня могут быть удалены из дерева с помощью вызова функции виджета-дерева takeTopLevelItem(), а элементы более низких уровней удаляются с помощью вызова функции takeChild() их родительского элемента. На верхний уровень древовидной структуры элементы могут быть вставлены с помощью функции insertTopLevelItem(). На более низких уровнях используется функция insertChild() родительского элемента.

Элементы легко перемещаются между самым верхним и более низкими уровнями дерева. Нам требуется лишь проверить, являются ли эти элементы элементами верхнего уровня или нет. Эту информацию можно получить с помощью функции parent() элемента. Например, мы можем удалить текущий элемент виджета-дерева вне зависимости от его расположения:

     QTreeWidgetItem *parent = currentItem->parent();
     int index;
 
     if (parent) {
         index = parent->indexOfChild(treeWidget->currentItem());
         delete parent->takeChild(index);
     } else {
         index = treeWidget->indexOfTopLevelItem(treeWidget->currentItem());
         delete treeWidget->takeTopLevelItem(index);
     }

Вставка элемента куда-нибудь в виджет-дерево осуществляется подобным образом:

     QTreeWidgetItem *parent = currentItem->parent();
     QTreeWidgetItem *newItem;
     if (parent)
         newItem = new QTreeWidgetItem(parent, treeWidget->currentItem());
     else
         newItem = new QTreeWidgetItem(treeWidget, treeWidget->currentItem());

[править] Виджеты-таблицы

Таблицы элементов, подобные тем которые предоставляются табличными редакторами, создаются с помощью QTableWidget и QTableWidgetItem. Они предоставляют прокручиваемую таблицу с заголовками и элементами в ней.

Таблицы могут создаваться сразу с нужным количеством строк и столбцов, или строки и столбцы могут добавляться по необходимости.

     QTableWidget *tableWidget;
     tableWidget = new QTableWidget(12, 3, this);

Элементы создаются вне таблицы, а затем размещаются в нужном месте:

     QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg(
         pow(row, column+1)));
     tableWidget->setItem(row, column, newItem);

Горизонтальные и вертикальные заголовки можно добавить в таблицу, создав их как элементы вне таблицы, а затем установив их в качестве заголовков:

     QTableWidgetItem *valuesHeaderItem = new QTableWidgetItem(tr("Values"));
     tableWidget->setHorizontalHeaderItem(0, valuesHeaderItem);

Обратите внимание на то, что нумерация строк и столбцов в таблице начинается с нуля.

[править] Общие возможности

У всех вспомогательных основанных на элементах классов есть множество общих возможностей, которые доступны через один и тот же интерфейс. Мы представим их с примерами для разных виджетов в следующих разделах. Подробнее об использовании каждой из возможностей для каждого конкретного из виджета смотрите Классы модель/представление.

[править] Скрытые элементы

Иногда в виджете представления элементов полезно скрывать элементы, вместо того чтобы удалять их. Элементы всех виджетов могут быть скрыты, а потом вновь показаны. Определить, скрыт ли элемент, можно с помощью функции isItemHidden(), а скрыть элементы с помощью функции setItemHidden().

Так как эта операция воздействует на элементы, она доступна во всех трех вспомогательных классах представлений.

[править] Выборы

Способ, которым выбираются элементы, управляется режимом выбора ( QAbstractItemView::SelectionMode). Данное свойство указывает, может ли пользователь выбирать один или несколько элементов, и, если пользователь может выбирать несколько, должен ли это быть непрерывный диапазон. Режим выбора работает одинаково для всех виджетов.


Файл:Selection-single.png

Выбор единственного элемента: Если пользователю нужно выбрать одиночный элемент, то значение по умолчанию SingleSelection - наиболее подходящий вариант. В этом режиме текущий элемент и выбранный элемент совпадают.

Файл:Selection-multi.png

Выбор нескольких элементов: В данном режиме пользователь может изменять состояние выбора любого элемента виджета без изменения состояния выбора всех остальных элементов, подобно тому как независимо друг от друга можно переключать флажки.

Файл:Selection-extended.png

Расширенный выбор: Виджетам, в которых часто требуется выбирать множество смежных элементов, как это делается в электронных таблицах, подходит режим выбора ExtendedSelection. В этом режиме непрерывные диапазоны элементов могут быть выбраны с помощью мыши или клавиатуры. Сложные выборы, включающие несмежные диапазоны элементов, можно сделать с помощью клавиш-модификаторов.

Если пользователь делает выбор без использования клавиш-модификаторов, существующий выбор очищается.

Выбранные в виджете элементы можно прочитать с помощью функции selectedItems(), возвращающей список соответствующих элементов, по которому можно перемещаться. Например, с помощью следующего кода мы можем найти сумму всех числовых значений выбранных элементов:

     QList<QTableWidgetItem *> selected = tableWidget->selectedItems();
     QTableWidgetItem *item;
     int number = 0;
     double total = 0;
 
     foreach (item, selected) {
         bool ok;
         double value = item->text().toDouble(&amp;ok);
 
         if (ok &amp;&amp; !item->text().isEmpty()) {
             total += value;
             number++;
         }
     }

Обратите внимание на то, что в режиме выбора единственного элемента текущий элемент будет присутствовать в выборе. В режимах выбора нескольких элементов и расширенного выбора, в зависимости от способа, которым пользователь сделал выбор, текущий элемент может не входить в выбор.

[править] Поиск

Часто как разработчику, так и пользователям, бывает полезно иметь возможность найти элементы в виджетах представления элементов. Все три вспомогательных класса представления элементов предоставляют такую возможность с помощью функции findItems().

Элементы ищутся по тексту, который они содержат, в соответствии с критериями, заданными набором значений Qt::MatchFlags. С помощью функции findItems() можно получить список соответствующих элементов:

     QTreeWidgetItem *item;
     QList<QTreeWidgetItem *> found = treeWidget->findItems(
         itemText, Qt::MatchWildcard);
 
     foreach (item, found) {
         treeWidget->setItemSelected(item, true);
         // Показать для каждого элемента item->text(0).
     }

Вышеприведенный код делает выбранными элементы виджета-дерева, если их текст содержит заданную строку поиска. Этот пример можно использовать также в виджетах-списках и виджетах-таблицах.

[Предыдущая: Классы делегатов ] [ Содержание ] [Следующая: Использование Drag and Drop с представлениями элементов ]



Copyright © 2007 Trolltech Trademarks
Qt 4.3.2