Использование QAbstractModelItem
не является интуитивным. Но, похоже, ваша самая большая проблема на самом деле моделирование вашего список путей в дерево элементов. Есть две задачи: ваши входные данные
- Процесс получения структуры данных, закрыть концептуальную интерпретацию данных (вы знаете, что они являются путь.)
- использовать эту структуру данных под
QAbstractItemModel
реализации.
Шаг 1: фактическая реализация дерева
Вы должны реализовать дерево первым. Что-то вроде
struct mytree
{
static std::shared_ptr<mytree> frompath(QString path);
static std::shared_ptr<mytree> merge(std::shared_ptr<mytree> t1, std::shared_ptr<mytree> t2);
//may need helpers : is leaf, etc, or just access to children
QString value;
std::list<std::shared_ptr<mytree> > childrens_;
mytree(); //construct empty tree
};
Где значение - имя файла или имя папки.
frompath
строит дерево из одной записи. C:\Parent2\Child1\Leaf2.jpg
становится
C->Parent2->Child1->Leaf2.jpg
merge
принять две существующие деревья и построить ни одного
C->Parent2->Child1->Leaf1.jpg
C->Parent2->Child2->Leaf1.jpg
становится
C->Parent2->{Child1->Leaf1.jpg, Child2->Leaf1.jpg}
Шаг 2: Модель
Если у вас есть этот список, вам нужно реализовать по крайней мере, одним из следующих способов:
QModelIndex parent(const QModelIndex & index) const;
QModelIndex index(int row, int column, const QModelIndex & parent) const;
int columnCount(const QModelIndex & parent) const;
int rowCount(const QModelIndex & parent) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
Некоторые советы:
- неверный модельный индекс
QModelIndex()
.Элемент верхнего уровня имеет QModelIndex
- Вы должны назначить один или несколько
QModelIndex
к объекту mytree
- У вас есть только один столбец для любого родителя, потому что есть только один данные (имя файла).
- Число строк - это количество детей.
- QModelIndex создан с использованием createIndex
Теперь, чтобы быть в состоянии осуществить эту методу необходимо добавить 3 поля в дерево:
- Ссылка на родительский
- позиции текущий элемент в родительском списке
- поле id, чтобы однозначно идентифицировать узел. Вы можете использовать
uint qHash(const QString & key)
на пути.
Новое дерево есть поля
struct mytree
{
//removed methods;
QString path; eg C:\Parent1\Child1
QString value; eg Child1
unsigned int id; eg: qHash(path)
int pos; //my position in the parent list. this is the row in the model
std::shared_ptr<mytree> parent;
std::list<std::shared_ptr<mytree> > childrens;
};
Вы должны быть в состоянии быстро получить mytree
с учетом его идентификатор. Это означает, что ваша внутренняя структура данных в модели будет
std::map<unsigned int, std::shared_pr<mytree> > items_by_id;
std::shared_pr<mytree> root_item;
Теперь у вас есть все, что вам нужно для реализации описанных выше методов. Это только для демонстрации, так что не принимаю этот код предоставленных
std::shared_pr<mytree> find_elt_helper(const QModelIndex & index) const
{
auto iter = items_by_id.find(index.internalId());
if(iter == items_by_id.end())
return std::shared_pr<mytree>();
return iter->second;
}
QModelIndex parent(const QModelIndex & index) const
{
if(!index.isValid())
return QModelIndex();
std::shared_pr<mytree> index_item = find_elt_helper(index);
return index_item ? create_index(index_item->parent->pos, 0, index_item->parent->id) : QModelIndex();
}
QModelIndex index(int row, int column, const QModelIndex & parent) const
{
std::shared_pr<mytree> parent_item = !parent.isValid() ? root_item : find_elt_helper(parent);
std::shared_pr<mytree> item;
if(row >= parent_item.children.size())
return QModelIndex();
item = parent_item.children[row];
return create_index(row, 0, item->id);
}
Добро пожаловать в StackOverflow! Пожалуйста, поделитесь тем, что вы пробовали, чтобы другие могли помочь вам лучше. –