у меня есть QAbstractItemModel
это оборачивает некоторые пользовательские данные (вектор указателей). Я использую эту модель с QSortFilterProxyModel
, QTreeView
и тому подобное.
При подключении другой логики к selectionChange
сигнал, мне нужны данные пользователя. Не какой-то взгляд на него, сам указатель.
Я добавил особый случай в метод данных.
QVariant data(const QModelIndex &index, int role) const override
Когда я передаю -1 как role
Я возвращаю указатель на мой тип пользователя в варианте. Это довольно хакерский, должен быть лучший «официальный» способ сделать это.
Как вернуть базовые данные модели из QModelIndex
и тому подобное?
Спасибо.
Ваш текущий путь на самом деле довольно близок к тому, что предлагает использовать Qt: вы передаете -1 как роль, чтобы сказать модели, чтобы она возвращала ваши пользовательские данные, в то время как Qt рекомендует вам использовать другое значение для роли: Qt :: ItemDataRole перечисление заканчивается Qt::UserRole
элемент, равный 0x0100
, Как говорится в документации, это первая роль, которую можно использовать для конкретных приложений. Таким образом, вместо передачи -1 в модель вы можете передать Qt::UserRole
, Если вам когда-либо понадобится использовать какой-либо другой вид данных для конкретного приложения, используйте Qt::UserRole + 1
как роль. Для других вы можете использовать Qt::UserRole + N
,
Однако есть и другой способ: как указано в одном из комментариев, если вы точно знаете, какая модель используется в представлении, вы можете просто привести QAbstractItemModel
к вашей конкретной модели и используйте некоторый специфичный для модели API для извлечения необходимых вам данных:
void MyView::selectionChanged(const QItemSelection & selected, const QItemSelection & deselect)
{
MyModel * myModel = qobject_cast<MyModel*>(model());
if (!myModel) {
// Whoops, something went wrong, not the right model!
<...> // process it somehow
return;
}
<...> // Use myModel to retrieve the required data using convenient model-specific API
}
Если вам нужно получить модель из QModelIndex
Просто используйте qobject_cast
как показано выше на QModelIndex::model()
,
Единственная хакерская вещь — это то, что вы явно передаете целое число. Я использую модели, которые все время возвращают указатели на реальный объект, просто выделяя определенный dataObject
роль, или как вы решили назвать его.