Возврат пользовательского типа пользователя из QAbstractItemModel

у меня есть QAbstractItemModel это оборачивает некоторые пользовательские данные (вектор указателей). Я использую эту модель с QSortFilterProxyModel, QTreeView и тому подобное.

При подключении другой логики к selectionChange сигнал, мне нужны данные пользователя. Не какой-то взгляд на него, сам указатель.

Я добавил особый случай в метод данных.
QVariant data(const QModelIndex &index, int role) const override

Когда я передаю -1 как roleЯ возвращаю указатель на мой тип пользователя в варианте. Это довольно хакерский, должен быть лучший «официальный» способ сделать это.

Как вернуть базовые данные модели из QModelIndex и тому подобное?
Спасибо.

0

Решение

Ваш текущий путь на самом деле довольно близок к тому, что предлагает использовать 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(),

2

Другие решения

Единственная хакерская вещь — это то, что вы явно передаете целое число. Я использую модели, которые все время возвращают указатели на реальный объект, просто выделяя определенный dataObject роль, или как вы решили назвать его.

0

По вопросам рекламы [email protected]