t02*_*608 6 c++ treeview qt drag-and-drop
我正在尝试使用基于 QAbstractItemModel 的模型为 TreeView 实现拖放,该模型取自此示例。
按照此处的指示,我已启用 TreeView 以进行拖放,如下所示:
view->setDragDropMode(QAbstractItemView::InternalMove);
view->setSelectionMode(QAbstractItemView::ExtendedSelection);
view->setDragEnabled(true);
view->setAcceptDrops(true);
view->setDropIndicatorShown(true);
Run Code Online (Sandbox Code Playgroud)
我也在我的模型中设置了适当的标志:
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;
return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEditable | QAbstractItemModel::flags(index);
}
Run Code Online (Sandbox Code Playgroud)
并重新实现了 QAbstractItemModel::supportedDropActions()
Qt::DropActions TreeModel::supportedDropActions() const
{
return Qt::CopyAction | Qt::MoveAction;
}
Run Code Online (Sandbox Code Playgroud)
结果是,当我将一行放在另一行之上时,后者会得到一个新的子行,而原始行不会被删除。但是,我想要的只是能够切换顶级行的顺序。
也许我的模型不合适?我在文档中找到了这篇文章,但它似乎比我需要的更复杂。
编辑:我现在已经实现DropMimeData()如下,但仍然没有运气。
bool TreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent){
if(!canDropMimeData(data, action, row, column, parent))
return false;
if (action == Qt::IgnoreAction)
return true;
int beginRow;
if (row != -1)
beginRow = row;
else if (parent.isValid())
beginRow = parent.row();
else
beginRow = rowCount(QModelIndex());
removeRow(row, parent);
insertRow(beginRow, parent);
setData(parent.child(beginRow, 0), data);
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6964 次 |
| 最近记录: |