【问题标题】:Insert and delete rows in QTreeView在 QTreeView 中插入和删除行
【发布时间】:2012-09-08 07:36:48
【问题描述】:

美好的一天,我有从 QAbstractItemModel 继承的基本模型,以及一些不时通知此模型的后台线程,在示例中,插入行实现了类似这样的操作

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;
} 

但我不能这样做,因为我的模型是单一的,它使用 4 个视图,我已经以这种方式实现了我的插入:

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
        } 

s_notify 是一个有实现的类:

 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*)) ));
        }

鉴于此,我调用该方法:

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();
        }
    }
} 

删除行完美,但插入不起作用。我的实现有什么问题?

【问题讨论】:

  • 您能否提供更多有关插入“不起作用”的详细信息?它会崩溃(如果是,错误信息是什么?)、什么也不做,还是做其他事情?

标签: c++ qt qtreeview qabstractitemmodel


【解决方案1】:

试试

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

您是否检查过 QT 文档 http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html 或 QT 示例以获取任何线索 http://qt-project.org/doc/qt-4.8/itemviews-editabletreemodel.html

正如你所说的线程,也许这可能会很有趣:

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2017-03-11
    • 2015-01-24
    • 2021-03-26
    相关资源
    最近更新 更多