我用QStringListModel创建了一个QListView。
listModel = new QStringListModel(ui->listView);
ui->listView->setModel(listModel);
ui->listView->setEditTriggers(QListView::NoEditTriggers);
ui->listView->setDragDropMode(QListView::InternalMove);
我使用以下方式添加项目:
void MainWindow::addItem(QString result)
{
if (result == "")
return;
listModel->insertRow(listModel->rowCount());
QModelIndex a = listModel->index(listModel->rowCount()-1);
listModel->setData(a,result);
}
问题是,当你拖动列表中的项目并尝试将其移动到另一个位置时,它更喜欢覆盖你拖动它的项目。我不希望通过拖放操作删除项目。
答案 0 :(得分:5)
从文档中我们得到了一些关于在QListView::dragDropOverwriteMode中寻找控制覆盖行为的地方的一些提示:
注意:这不是为了防止覆盖项目。 模型的 flags()的实现应该通过不返回 Qt :: ItemIsDropEnabled 来实现。
这告诉我们模型是控制它的模型。然后查看 QStringListModel::flags(const QModelIndex & index) const的文档,我们可以看到它默认启用覆盖:
从QAbstractItemModel :: flags()重新实现。 返回具有给定索引的项的标志。 有效项目已启用,可选,可编辑,已启用拖动且已启用。
因此,为了更改此行为,您需要自定义模型(即至少从QStringListModel派生)并将flags(const QModelIndex & index) const
方法的行为更改为不返回Qt::ItemIsDropEnabled
。
这应该可以阻止您的输入被覆盖。