Неправильное поведение внутри QAbstractItemModel
От: arfaa  
Дата: 15.05.20 13:58
Оценка:
Добрый день, работаю с моделью , наследованной от QAbstractItemModel. В одной из функций при одном условии удаляю и заполняю таблицу новым количеством строк, при переключении делаю такой же механизм:
    if (_modeRow == 0)
    {
        if (rowCount() < m_TradeItems.size())
        {
            beginResetModel();
            beginRemoveRows(QModelIndex(), 0, _rowCount-1);
            endRemoveRows();
            beginInsertRows(QModelIndex(), 0, m_TradeItems.size());
            endInsertRows();
            _rowCount = m_TradeItems.size() + 1;
        
            endResetModel();
            emit signalSetSpanRow(_rowCount);
        }
    }
    if (_modeRow == 1)
    {
        if (_rowCount > _nettoTrades.size() + 1 || _rowCount == -1)
        {
            _rowCount = m_TradeItems.size() + 1;
            beginResetModel();
            beginRemoveRows(QModelIndex(), 0, m_TradeItems.size());
            endRemoveRows();
            beginInsertRows(QModelIndex(), 0, _nettoTrades.size());
            endInsertRows();
            _rowCount = _nettoTrades.size() + 1;
            
            endResetModel();
            emit signalSetSpanRow(_rowCount);
        }
        
    }
    lt = index(0, 0);
    rb = index(_rowCount-1, columnCount() - 1);
    emit dataChanged(lt, rb);

отрисовка происходит с правильным количеством строк, но в date, к примеру в одном из случаев не падает в точку останова, когда index.column>3 и выводит все неправильно-это при _modeRow = 1, при возврате к первоначальному отображению(_modeRow = 0) все отображается корректно, в date падает во все column > 3 и так далее. Что делаю не так при обновлении таблицы?
Re: Неправильное поведение внутри QAbstractItemModel
От: Igore Россия  
Дата: 15.05.20 14:57
Оценка: +1
Здравствуйте, arfaa, Вы писали:

A>Добрый день, работаю с моделью , наследованной от QAbstractItemModel. В одной из функций при одном условии удаляю и заполняю таблицу новым количеством строк, при переключении делаю такой же механизм:

A> if (_modeRow == 0)
A> {
A> if (rowCount() < m_TradeItems.size())
A> {
A> beginResetModel();
начали очищать, так очишай
data.reset();
A> beginRemoveRows(QModelIndex(), 0, _rowCount-1);
A> endRemoveRows();
A> beginInsertRows(QModelIndex(), 0, m_TradeItems.size());
A> endInsertRows();
не нужно beginRemoveRows, endRemoveRows, beginInsertRows, endInsertRows мы уже в beginResetModel находимся, по endResetModel view запросит просто новое количестов строк, столбцов
A> _rowCount = m_TradeItems.size() + 1;

A> endResetModel();

A> emit signalSetSpanRow(_rowCount);
A> }
A> }
A> if (_modeRow == 1)
A> {
A> if (_rowCount > _nettoTrades.size() + 1 || _rowCount == -1)
A> {
A> _rowCount = m_TradeItems.size() + 1;
A> beginResetModel();
A> beginRemoveRows(QModelIndex(), 0, m_TradeItems.size());
A> endRemoveRows();
A> beginInsertRows(QModelIndex(), 0, _nettoTrades.size());
A> endInsertRows();
A> _rowCount = _nettoTrades.size() + 1;

A> endResetModel();

A> emit signalSetSpanRow(_rowCount);
A> }

A> }

A> lt = index(0, 0);
A> rb = index(_rowCount-1, columnCount() — 1);
A> emit dataChanged(lt, rb);
A>отрисовка происходит с правильным количеством строк, но в date, к примеру в одном из случаев не падает в точку останова, когда index.column>3 и выводит все неправильно-это при _modeRow = 1, при возврате к первоначальному отображению(_modeRow = 0) все отображается корректно, в date падает во все column > 3 и так далее. Что делаю не так при обновлении таблицы?
Похоже написано лишнее, resetModel это когда полностью обновляешь модель, после этого emit dataChanged и не нужно, view само перечитает, emit dataChanged на beginInsertRows тоже не нужно, view само перечитает. Мало данных по тому что у тебя в модели происходит, можешь поподробнее описать что происходит, с примером кода в data.
Отредактировано 15.05.2020 14:57 Igore . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.