QAbstractItemModel beginInsertItem and update model problem.



  • I'm writing class which inherits QAbstractItemModel and has a 2-level tree structure , this model is using other class which has it's own structure. I have such a problem when my structure changes. I know about all changes by signals which emitted my structure class. So i insert row first in a structure class then i emit signal and need to update my model. When I use reset model it's work perfect, but i need to update only that place where i hawe some changes. So here what I wrote:
    @void SessionsTreeModel::onSessionCreated( int sessionID ) {
    int index = GET_SESSION_MANAGER()->getSessionList().findIndexById(sessionID);

    if (index == -1) {
        return;
    }
    
    if (m_sessionIDs.contains(sessionID)) {
        return;
    }
    
    m_sessionIDs.insert(sessionID,index);
    
    beginInsertRows(QModelIndex(),index,index);
    endInsertRows();
    
    SharedSessionItem sessionItem = GET_SESSION_MANAGER()->getSessionList().getSessionByID(sessionID);
    
    if (sessionItem.isNull()) {
        return;
    }
    
    QList<sxProperties> targets = sessionItem->getTargets();
    
    for (int i = 0; i < targets.count(); i++) {
        onTargetAppended(sessionID, targets.at(i).valueS(PropName::name));
    }
    

    }
    //---------------------------------------------------------------------------------------------------------------
    void SessionsTreeModel::onSessionRemoved( int sessionID ) {
    int index = m_sessionIDs.take(sessionID);
    beginRemoveRows(QModelIndex(),index,index);
    endRemoveRows();
    }
    //---------------------------------------------------------------------------------------------------------------
    void SessionsTreeModel::onTargetAppended( int sessionID, const QString & target ) {
    int parentIndex = m_sessionIDs.value(sessionID, -1);//GET_SESSION_MANAGER()->getSessionList().findIndexById(sessionID);

    if (parentIndex == -1) {
        return;
    }
    
    SharedSessionItem sessionItem = GET_SESSION_MANAGER()->getSessionList().getSessionByID(sessionID);
    
    if (sessionItem.isNull()) {
        return;
    }
    
    int index = sessionItem->getTargetIndex(target);
    
    if (index == -1) {
        return;
    }
    
    QModelIndex parent = this->index(parentIndex,eName,QModelIndex());
    
    if (parent.isValid() == false) {
        return;
    }
    
    QHash<QString,int> targets = m_targetNames.take(sessionID);
    
    if (targets.contains(target)) {
        m_targetNames.insert(sessionID,targets);
        return;
    }
    
    targets.insert(target,index);
    m_targetNames.insert(sessionID,targets);
    
    beginInsertRows(parent,index,index);
    endInsertRows();
    

    }
    //---------------------------------------------------------------------------------------------------------------
    void SessionsTreeModel::onTargetRemoved( int sessionID, const QString & target ) {
    int parentIndex = m_sessionIDs.value(sessionID, -1);

    if (parentIndex == -1) {
        return;
    }
    
    
    QHash<QString,int> targets = m_targetNames.take(sessionID);
    
    if (targets.contains(target) == false) {
        m_targetNames.insert(sessionID,targets);
        return;
    }
    
    int index = targets.take(target);
    m_targetNames.insert(sessionID,targets);
    
    QModelIndex parent = this->index(parentIndex,eName,QModelIndex());
    
    if (parent.isValid() == false) {
        return;
    }
    
    beginRemoveRows(parent,index,index);
    endRemoveRows();
    

    }
    //---------------------------------------------------------------------------------------------------------------@

    Where @private: QHash<int,int> m_sessionIDs; // holds row by given id for remove session
    private: QHash<int,QHash<QString, int>> m_targetNames; // first key = sessionID
    //included hash holds row by given name for remove target
    private: enum eColumns {eName,eUrl,eSource, eState, eDate,eTime,eMax}; // eName - id of session,
    //or Target name who receives session@

    and @GET_SESSION_MANAGER()@ gives instance to my structure class.
    When I start my model I only have one item 1-st level item. When i add 1-st level items it updates, but when add 2-nd level items it's updates only when i collaps\expand it's root. So please help.



  • Hmm, the endRemoveRows() does emit a signal to update the view. I would suggest looking into the View that you use if there is a "expand" level setting.
    The model looks correct to me.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.