Вернуть пользовательский тип из QAbstractItemModel - PullRequest
0 голосов
/ 13 июня 2018

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

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

0 голосов
/ 13 июня 2018

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

...