Qt:Документация 4.3.2/model-view-convenience
Материал из Wiki.crossplatform.ru
|   | Внимание: Актуальная версия перевода документации находится здесь | 
__NOTOC__
| Главная · Все классы · Основные классы · Классы по группам · Модули · Функции | 
[Предыдущая: Классы делегатов ] [ Содержание ] [Следующая: Использование 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). Данное свойство указывает, может ли пользователь выбирать один или несколько элементов, и, если пользователь может выбирать несколько, должен ли это быть непрерывный диапазон. Режим выбора работает одинаково для всех виджетов.
| Выбор единственного элемента: Если пользователю нужно выбрать одиночный элемент, то значение по умолчанию SingleSelection - наиболее подходящий вариант. В этом режиме текущий элемент и выбранный элемент совпадают. | |
| Выбор нескольких элементов: В данном режиме пользователь может изменять состояние выбора любого элемента виджета без изменения состояния выбора всех остальных элементов, подобно тому как независимо друг от друга можно переключать флажки. | |
| Расширенный выбор: Виджетам, в которых часто требуется выбирать множество смежных элементов, как это делается в электронных таблицах, подходит режим выбора 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(&ok); if (ok && !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 | 


