Как получить индекс из элемента в QTreeView - PullRequest
0 голосов
/ 11 января 2019

Мое Qt-приложение было построено на примере EditableTreeModel из Qt. В классе TreeModel есть функция с именем getItem(), которая принимает QModelIndex в качестве параметра и возвращает TreeItem.

Для моего приложения мне нужна обратная функция: получение QModelIndex из TreeItem. Это должно быть независимым от просмотра. Это означает, что я не могу использовать функцию QTreeView::currentIndex().

Есть ли хорошее решение для моей проблемы?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вы можете построить карту от TreeItem до QModelIndex следующим образом:

    void buildMap(const QModelIndex &index, const QAbstractItemModel *model, QMap<TreeItem *, QModelIndex> &itemMap)
    {
            if( !index.isValid() )
                    return;

            TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
            itemMap.insert( item, index );

            int rows = model->rowCount(index);
            int cols = model->columnCount(index);

            for (int i = 0; i < rows; ++i)
                    for (int j = 0; j < cols; ++j){
                            QModelIndex idChild = model->index(i, j, index);
                            buildMap( idChild , model, itemMap );
                    }
    }

Функция buildMap должна использоваться как:

        QMap<TreeItem *, QModelIndex> itemMap;
        TreeModel *model = static_cast<TreeModel *>(view->model());

        for (int row = 0; row < model->rowCount(); ++row){
            buildMap( model->index(row,0), model, itemMap );
        }

        qDebug() << "Item map count : " << itemMap.count();

        foreach( TreeItem * item, itemMap.keys( )){
                qDebug() << "item " << item << " -> " << itemMap[ item ];
        }

Выход:

    Item map count :  35
    item  0xbe1fe8  ->  QModelIndex(1,1,0xbe1fe8,TreeModel(0x4421390))
    item  0xbe2020  ->  QModelIndex(2,1,0xbe2020,TreeModel(0x4421390))
    item  0xbe22f8  ->  QModelIndex(3,1,0xbe22f8,TreeModel(0x4421390))
    item  0xbe2330  ->  QModelIndex(2,0,0xbe2330,TreeModel(0x4421390))
    ...
0 голосов
/ 11 января 2019

Вам нужно позвонить QAbstractItemModel::createIndex, передав правильные значения row, column и сам элемент.

Должно работать следующее:

QModelIndex TreeModel::indexForTreeItem(TreeItem* item)
{
    return createIndex(item->childNumber(), 0, item);
}

Объяснение того, как я пришел к этому:

createIndex также принимает указатель данных void*, который в примере кода EditableTreeModel TreeModel является указателем на TreeItem. Это можно видеть в функции-члене TreeModel::index:

QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const
{
    if (parent.isValid() && parent.column() != 0)
        return QModelIndex();

    TreeItem *parentItem = getItem(parent);

    TreeItem *childItem = parentItem->child(row);
    if (childItem)
        return createIndex(row, column, childItem); // <-- here childItem is the TreeItem*
    else
        return QModelIndex();
}

Обратите внимание, что QAbstractItemModel::createIndex является защищенной функцией, поэтому вам нужно добавить новую функцию-член в TreeModel, которая создаст для вас QModelIndex.

Чтобы вычислить строку для данного TreeItem, есть функция-член childNumber, которая возвращает свой индекс в списке дочерних элементов своего родителя (то есть: его строка)

К сожалению, невозможно вычислить столбец для данного TreeItem, поскольку TreeItem содержит все данные для его столбцов, поэтому охватывает все столбцы. Таким образом, разумным значением по умолчанию будет использование 0 (крайний левый столбец)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...