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.