На этом шаге рассмотрим понятие "выделения элемента", как части технологии "интервью".
Обычно в представлениях имеется механизм, управляющий выделением элементов, т. е. каждое представление реализует свое собственное выделение элементов в отдельной части кода. Это неудобно, т. к. для большого количества представлений этот код может быть разбросан по разным частям программы. Описанный далее механизм позволяет реализовать выделение элемента централизованно, в одном месте. Таким образом, мы получаем возможность разделения между различными представлениями, работающими с одной моделью данных, не только собственно ее данных, но и механизма выделения.
Управление выделением осуществляется при помощи специальной модели, реализованной в классе 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().
На следующем шаге рассмотрим понятие "делегата", как составной части технологии "модель-представление".