| Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |
[Предыдущая: Классы Делегатов] [Содержание] [Следующая: Использование Drag and Drop с Представлениями Элементов]
Наряду с классами модель/представление, Qt 4 также включает стандартные виджеты реализующие классические основанные на элементах контейнеры. Они ведут себя подобно представлениям элементов Qt 3, но переписаны для использования с каркасом модель/представление. Старые классы представлений элементов все еще доступны (дополнительную информацию см. Руководство по Портированию).
Основанные на элементах виджеты имеют имена, отражающие их назначение: QListWidget предоставляет список элементов, QTreeWidget отображает многоуровневую древовидную структуру, а QTableWidget предоставляет таблицу с ячейками. Каждый из этих классов наследует поведение класса QAbstractItemView, который реализует общее поведение выбора элементов и управление заголовками.
Одноуровневые списки элементов обычно отображаются с помощью 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);
// Show the item->text(0) for each item.
}
Вышеприведенный код делает выбранными элементы виджета-дерева если их текст содержит заданную строку поиска. Этот код также может использоваться в виджетах-списках и виджетах-таблицах.
[Предыдущая: Классы Делегатов] [Содержание] [Следующая: Использование Drag and Drop с Представлениями Элементов]
| Copyright © 2005 Trolltech | Trademarks | Qt 4.1.0 |