Russian Qt Forum

Qt => Model-View (MV) => Тема начата: ruzik от Август 24, 2012, 21:53



Название: QModelIndex из QStandardItemModel в QSortFilterProxyModel
Отправлено: ruzik от Август 24, 2012, 21:53
Здравствуйте, есть такой код, который добавляет новый элемент:
Код:
    //Create new item
    _sourceModel->insertRow(_sourceModel->rowCount(sourceFolderIndex), sourceFolderIndex);
    QModelIndex sourceIndexOfNewItem
            = _sourceModel->index(_sourceModel->rowCount(sourceFolderIndex)-1, 0, sourceFolderIndex);
    QModelIndex searchIndexOfNewItem = _searchModel->mapFromSource(sourceIndexOfNewItem);
    qDebug() << sourceIndexOfNewItem;
    qDebug() << searchIndexOfNewItem;
_sourceModel - есть наследник QStandardItemModel.
_seacrhModel - есть наследник QSortFilterProxyModel.
Ни в одном из наследников используемые методы НЕ переопределялись.
sourceFolderIndex - индекс элемента-родителя для создаваемого элемента.
А ошибка вот в чем:
Если мы ничего не ищем(в модель поиска забита пустая строка), то код работает нормально и оба индекса валидны, но если мы что-то ищем, то создается новый элемент, его индекс вычисляется нормально, но вот индекс поисковой модели(_searchModel->mapFromSource(sourceIndexOfNewItem);) вычисляется неправильно(возвращается просто невалидный индекс).


Название: Re: QModelIndex из QStandardItemModel в QSortFilterProxyModel
Отправлено: fte от Август 24, 2012, 22:41
_sourceModel->insertRow(_sourceModel->rowCount(sourceFolderIndex), sourceFolderIndex);
is true ?


Название: Re: QModelIndex из QStandardItemModel в QSortFilterProxyModel
Отправлено: ruzik от Август 24, 2012, 23:02
Да этот метод возвращает true при любом раскладе


Название: Re: QModelIndex из QStandardItemModel в QSortFilterProxyModel
Отправлено: ruzik от Август 25, 2012, 18:47
Хм какая-то фигня выходит:
Проверил все это в релизе выходит так как написал, в режиме отладке так как написал, поставил точку останова и прошелся вычислилось оба индекса неправильно(при том что в поиске забита нулевая строка), и все время пишет это в лог:
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
Но тем не менее это строчка: _sourceModel->insertRow(_sourceModel->rowCount(sourceFolderIndex), sourceFolderIndex);
все равно выдает true, а на выходе получилось что на каждую такую строку в логе создался элемент в модели.


Название: Re: QModelIndex из QStandardItemModel в QSortFilterProxyModel
Отправлено: ruzik от Август 25, 2012, 19:00
Теперь вообще раз на раз не приходиться, проделал тоже самое с точкой останова те же лишние элементы, но теперь хотя бы индексы вычислились нормально.
Если как-то поможет вот весь код метода:
Код:
void RizekFaster::addItem()
{
    //If there is selected index
    QModelIndex sourceFolderIndex;
    if (dataTreeView->getSelectedIndexes().count() > 0)
    {
        sourceFolderIndex = _searchModel->mapToSource(dataTreeView->getSelectedIndexes()[0]);

        QStandardItem *folderItem = _sourceModel->item(sourceFolderIndex);
        //Convert item in the folder if it doesnt
        if (!folderItem->hasChildren())
        {
            _sourceModel->insertColumn(0, sourceFolderIndex);
            _sourceModel->insertColumn(1, sourceFolderIndex);
            folderItem->setIcon(RIconManager::standartFolderIcon());
        }
    }
    //Create new item
    qDebug() << _sourceModel->insertRow(_sourceModel->rowCount(sourceFolderIndex), sourceFolderIndex);
    QModelIndex sourceIndexOfNewItem
            = _sourceModel->index(_sourceModel->rowCount(sourceFolderIndex)-1, 0, sourceFolderIndex);
    QModelIndex searchIndexOfNewItem =  _searchModel->mapFromSource(sourceIndexOfNewItem);
    qDebug() << sourceIndexOfNewItem;
    qDebug() << searchIndexOfNewItem;
    RDataItem *newItem = _sourceModel->item(sourceIndexOfNewItem);
    //---Set text of new item
    //This is do for when the search for new item does not disappear
    QString searchText = columnSearchLineEdit->text();
    if (searchText.isEmpty())
    {
        QClipboard *clipboard = QApplication::clipboard();
        const QString clipboardText = clipboard->text();
        if (RDataTypeManager::type(clipboardText) != RDataTypeManager::Other)
            newItem->setText(clipboardText);
        else
            newItem->setText(tr("New item"));
    }
    else
        newItem->setText(searchText);
    //Select this item
    dataTreeView->selectionModel()->clear();
    dataTreeView->selectionModel()->setCurrentIndex(searchIndexOfNewItem
                                 , QItemSelectionModel::Rows | QItemSelectionModel::SelectCurrent);
    dataTreeView->edit(searchIndexOfNewItem);
}
Но как вы видите важны именно строки, которые я вам привел, все остальное отвечает за текст, иконки и тп