crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Как правильно создать 3-х уровневую модель дерева?
Rocky
  опции профиля:
сообщение 14.12.2010, 11:42
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Вроде бы внимательно изучил документацию, примеры simple и edit tree model. Начал сам делать и совсем запутался... Помогите распутаться плиз... Хочу сделать 3-х уровневую модель дерева. В примерах есть класс TreeItem который содержит указатель на родителя и список чайлдов. Но этот родитель и элементы списка сами являются TreeItem. С этим вроде бы ясно... А как развернуть эту структуру? Чтобы данные как бы отделить друг от друга?
Например превратить ее в 4 класса:
1. Класс самой модели.
2. Класс с данными верхенго уровня (содержит список данных и список чайлдов 3)
3. Класс с данными среднего уровня (содержит список данных и список чайлдов 4 и указатель на парента 2)
4. Класс с данными нижнего уровня (содержит список данных и указатель на парента 3)
А как при таком раскладе написать тела виртуальных функций QAbstractItemModel (index и parent и rowCount)?

3-й день сижу и ниче не получается (

Или этот подход неверен?

Сама задача такая. Есть список имен. Каждому элементу из этого списка соответсвует список других имен. Каждому элементу из последнего списка соответсвует набор данных. Как это все представить для модели? ((

Спасибо если кто-нибудь что-нибудь подскажет...

Сообщение отредактировал Rocky - 14.12.2010, 11:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
kuzulis
  опции профиля:
сообщение 14.12.2010, 16:15
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата(Rocky @ 14.12.2010, 16:06) *
kuzulis, все, идею понял, супер!... Только не мог бы ты подсказать насчет кода функций index/parent/rowCount плиз?)


Вот, думаю разберешься:
QModelIndex CoreTreeModel::index(int row, int column, const QModelIndex &parent) const
{
    if (this->rootNode && this->hasIndex(row, column, parent)) {
        BaseNode *parentNode = (parent.isValid()) ?
                               (static_cast<BaseNode *>(parent.internalPointer())) : (this->rootNode);
        if (parentNode) {
            BaseNode *childNode = parentNode->child(row);
            if (childNode)
                return createIndex(row, column, childNode);
        }
    }
    return QModelIndex();
}

QModelIndex CoreTreeModel::parent(const QModelIndex &index) const
{
    if (this->rootNode && index.isValid()) {
        BaseNode *childNode = static_cast<BaseNode *>(index.internalPointer());
        if (childNode) {
            BaseNode *parentNode = childNode->parent();
            if (parentNode != this->rootNode)
                return this->createIndex(parentNode->row(), 0, parentNode);
        }
    }
    return QModelIndex();
}

int CoreTreeModel::rowCount(const QModelIndex &parent) const
{
    if (this->rootNode && (parent.column() <= 0)) {
        BaseNode *parentNode = (parent.isValid()) ?
                           (static_cast<BaseNode *>(parent.internalPointer())) : (this->rootNode);
        return parentNode->childCount();
    }
    return 0;
}


Как то так
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 9:21