停止QListView删除拖放条目

时间:2014-02-17 04:59:49

标签: c++ qt qt5 qlistview

我用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);
}

问题是,当你拖动列表中的项目并尝试将其移动到另一个位置时,它更喜欢覆盖你拖动它的项目。我不希望通过拖放操作删除项目。

1 个答案:

答案 0 :(得分:5)

从文档中我们得到了一些关于在QListView::dragDropOverwriteMode中寻找控制覆盖行为的地方的一些提示:

  

注意:这不是为了防止覆盖项目。 模型 flags()的实现应该通过不返回 Qt :: ItemIsDropEnabled 来实现。

这告诉我们模型是控制它的模型。然后查看 QStringListModel::flags(const QModelIndex & index) const的文档,我们可以看到它默认启用覆盖:

  

从QAbstractItemModel :: flags()重新实现。   返回具有给定索引的项的标志。   有效项目已启用,可选,可编辑,已启用拖动且已启用。

因此,为了更改此行为,您需要自定义模型(即至少从QStringListModel派生)并将flags(const QModelIndex & index) const方法的行为更改为不返回Qt::ItemIsDropEnabled

这应该可以阻止您的输入被覆盖。