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 |