Qt Model 移动数据

由于Qt没有实现移动数据的函数moveRows,若是要移动数据,可先调用beginMoveRows,再对数据进行更改,最后调用endMoveRows。移动列函数同上。

例如可重写moveRows

以下写法会导致index发生变化,若是使用QPersistentModelIndex储存过数据需注意,可以在model发出rowsMoved信号时进行处理。

bool Model::moveRows(const QModelIndex &source_parent, int source_row, int count, 
                                     const QModelIndex &destination_parent, int destination_child) {
    if (beginMoveRows(source_parent, source_row, source_row + count - 1, destination_parent, destination_child)) {
        blockSignals(true);
        // 移动数据
        for (int i = 0; i < count; i++) {
            QList<QStandardItem *> from_row = takeRow(source_row); //this also removes it from the model!
            beginInsertRows(QModelIndex(), destination_child + 1, destination_child + 1);
            insertRow(source_row > destination_child ? destination_child : destination_child - 1, from_row);
        }
        blockSignals(false);
        endMoveRows();
        return true;
    }
    return false;
}

参考:https://forum.qt.io/topic/86021/qabstractitemmodel-endmoverows-invalid-index

Qt中,可以使用模型视图框架来管理和显示数据。要移动模型视图中的项的位置,可以使用以下方法: 1. 使用QModelIndex类来表示项的位置。QModelIndex包含了项的行和列信息,可以通过模型的索引方法获取。 2. 使用QAbstractItemModel类来管理模型数据。这是一个抽象基类,可以根据需要派生实现自定义的模型类。 3. 使用QTreeView、QTableView或QListView等视图类来显示模型数据。这些类提供了用户界面,可以显示和编辑模型数据。 要移动项的位置,可以按照以下步骤进行操作: 1. 获取要移动的项的源索引,可以使用模型的index()方法获取。 2. 获取目标位置的索引,可以使用模型的index()方法获取。 3. 使用模型的beginMoveRows()方法通知视图开始移动项的位置。该方法接受源索引的父索引、源索引的起始行和结束行、目标位置的父索引以及目标位置的行。 4. 使用模型的moveRow()方法实际移动项的位置。该方法接受源索引的父索引、源索引的行、目标位置的父索引以及目标位置的行。 5. 使用模型的endMoveRows()方法通知视图完成移动项的位置。 下面是一个示例代码,演示如何移动模型视图中的项的位置: ```cpp QModelIndex sourceIndex = model->index(sourceRow, 0, sourceParent); QModelIndex targetIndex = model->index(targetRow, 0, targetParent); model->beginMoveRows(sourceParent, sourceRow, sourceRow, targetParent, targetRow); model->moveRow(sourceParent, sourceRow, targetParent, targetRow); model->endMoveRows(); ``` 请注意,上述代码中的model是一个QAbstractItemModel类的实例,sourceRow和targetRow分别是源索引和目标索引的行,sourceParent和targetParent分别是源索引和目标索引的父索引。 希望这能帮助到你!如果你有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值