Russian Qt Forum
Ноябрь 23, 2024, 14:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QModelIndex из QStandardItemModel в QSortFilterProxyModel  (Прочитано 3227 раз)
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)Подмигивающий вычисляется неправильно(возвращается просто невалидный индекс).
Записан
fte
Гость
« Ответ #1 : Август 24, 2012, 22:41 »

_sourceModel->insertRow(_sourceModel->rowCount(sourceFolderIndex), sourceFolderIndex);
is true ?
Записан
ruzik
Гость
« Ответ #2 : Август 24, 2012, 23:02 »

Да этот метод возвращает true при любом раскладе
Записан
ruzik
Гость
« Ответ #3 : Август 25, 2012, 18:47 »

Хм какая-то фигня выходит:
Проверил все это в релизе выходит так как написал, в режиме отладке так как написал, поставил точку останова и прошелся вычислилось оба индекса неправильно(при том что в поиске забита нулевая строка), и все время пишет это в лог:
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
Но тем не менее это строчка: _sourceModel->insertRow(_sourceModel->rowCount(sourceFolderIndex), sourceFolderIndex);
все равно выдает true, а на выходе получилось что на каждую такую строку в логе создался элемент в модели.
« Последнее редактирование: Август 25, 2012, 18:49 от ruzik » Записан
ruzik
Гость
« Ответ #4 : Август 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);
}
Но как вы видите важны именно строки, которые я вам привел, все остальное отвечает за текст, иконки и тп
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 21.