Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Insert and delete rows in QTreeView

Good day, I Have base model inherited from QAbstractItemModel, and some background threads which notify this model from time to time, in examples the insertions rows implemens somthing like this

bool TreeModel::insertRows(int position, int rows, const QModelIndex &parent)
{
    TreeItem *parentItem = getItem(parent);
    bool success;

    beginInsertRows(parent, position, position + rows - 1);
    success = parentItem->insertChildren(position, rows, rootItem->columnCount());
    endInsertRows();

    return success;
} 

But I can't do it like this because my model is single which uses 4 views, I've implemented my insertion this way:

void notifyEventImpl(file_item_type *sender,helper<ITEM_ACTION_ADDED>)
        {
            base_class::setSize(file_item_type::size()+sender->size());         
            m_listDirectory.push_back(sender);
            file_item_type::filesystem_type::s_notify.insert(this); // notify my model
        } 

Where s_notify is a class with implementation:

 void Notifaer::dataChange(void * item){emit dataChanged(item);}
        void Notifaer::remove(void * item){emit removed(item);}
        void Notifaer::insert(void * item){emit inserted(item);}
        void Notifaer::push_back(const FileItemModel * model)
        {
            VERIFY(QObject::connect(this,SIGNAL(dataChanged(void*)),model,SLOT(dataChangeItem(void*)) ));
            VERIFY(QObject::connect(this,SIGNAL(removed(void*)),model,SLOT(removeItem(void*)) ));
            VERIFY(QObject::connect(this,SIGNAL(inserted(void*)),model,SLOT(insertItem(void*)) ));
        }

Given this, I invoke the method:

void FileItemModel::insertItem(void *it)
{
    file_item_type *item = dynamic_cast<file_item_type*>(static_cast<file_item_type*>(it));

    {
        QModelIndex index = createIndex(0,0,item);
        if (index.isValid())
        {
            beginInsertRows(index, 0, item->childCount()-1);
            endInsertRows();
        }
    }
}
void FileItemModel::removeItem(void *it)
{
    file_item_type *item = static_cast<file_item_type*>(it);

    {
        QModelIndex index = createIndex(0,0,item);
        if (index.isValid())
        {
            beginRemoveRows(index, 0, item->childCount()-1);
            endRemoveRows();
        }
    }
} 

Remove rows works perfectly, but insert does not work. What's wrong in my implementation?

like image 416
Topilski Alexandr Avatar asked Sep 15 '12 09:09

Topilski Alexandr


1 Answers

Try with

 beginInsertRows(QModelIndex(), 0, item->childCount()-1);

Have you checked QT doc http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html or QT examples to get any clue http://qt-project.org/doc/qt-4.8/itemviews-editabletreemodel.html?

As you said threads, maybe this could be interesting to read:

  • Design Pattern, Qt Model/View and multiple threads

  • QTreeView & QAbstractItemModel & insertRow

like image 98
kikeenrique Avatar answered Oct 10 '22 01:10

kikeenrique