Шаг 102.
Библиотека Qt.
Выделение элемента, как часть технологии "интервью"

    На этом шаге рассмотрим понятие "выделения элемента", как части технологии "интервью".

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

    Управление выделением осуществляется при помощи специальной модели, реализованной в классе QItemSelectionModel (рис. 1).


Рис.1. Класс выделения QItemSelectionModel

    Для получения модели выделения элементов, установленной в представлении, нужно вызвать метод QAbstractItemView:: selectionModel(), а установить новую модель можно с помощью метода QAbstractItemView::setSelectionModel().

    Программа, окно которой показано на рис. 2, выполняет разделение выделения элементов между тремя представлениями. Выделение элемента в одном из представлений приведет к выделению этого же элемента и в остальных представлениях.


Рис.2. Демонстрация разделения выделения элементов между представлениями

    Рассмотрим часть кода приложения:

//создаем модель списка строк (объект model),
QStringListModel model;
//которую инициализируем тремя элементами
//каждый элемент является строкой
model.setStringList(QStringList() << "Элемент 1" << "Элемент 2" << "Элемент 3");
//создаем три разных представления (указатели pTreeView,
//pListView и pTableView) и устанавливаем в них нашу модель,
//вызывая метод setModel()
QTreeView* pTreeView = new QTreeView;
pTreeView->setModel(&model);
QListView* pListView = new QListView;
pListView->setModel(&model);
QTableView* pTableView = new QTableView;
pTableView->setModel(&model);
//создаем модель выделения (объект класса QItemSelectionModel)
//при создании этот объект инициализируется оригинальной моделью (объект model)
QItemSelectionModel selection(&model);
//модель выделения устанавливается вызовом метода
//setSelectionModel() во всех трех объектах представления
pTreeView->setSelectionModel(&selection);
pListView->setSelectionModel(&selection);
pTableView->setSelectionModel(&selection);

    Файлы приложения можно взять здесь.

    Индексы текущих выделенных позиций можно получить вызовом метода QItemSelectionModel:: selectedIndexes(). А выделять элементы программно можно с помощью метода QItemSelectionModel::select(). При изменениях выделения модель выделений отсылает сигналы currentChanged(), selectionChanged(), currentColumnChanged() и currentRowChanged().

   На следующем шаге рассмотрим понятие "делегата", как составной части технологии "модель-представление".




Предыдущий шаг Содержание Следующий шаг