停止QListView删除拖放条目

Ser*_*dis 1 c++ qt qlistview qt5

我用QStringListModel创建了一个QListView.

listModel = new QStringListModel(ui->listView);
ui->listView->setModel(listModel);
ui->listView->setEditTriggers(QListView::NoEditTriggers);
ui->listView->setDragDropMode(QListView::InternalMove);
Run Code Online (Sandbox Code Playgroud)

我使用以下方法添加项目:

void MainWindow::addItem(QString result)
{
    if (result == "")
        return;
    listModel->insertRow(listModel->rowCount());
    QModelIndex a = listModel->index(listModel->rowCount()-1);
    listModel->setData(a,result);
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*hew 5

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

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

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

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

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

这应该可以阻止你的输入被覆盖.

  • 您不必对模型进行子类化。如果您使用 QStandardItem 模型,您可以创建 QStandardItem,设置适当的标志并在 ```setItemPrototype()``` 中使用该项目。 (2认同)
  • 这个讨论有点老了,但我刚刚发现它,它很震撼!尽管如此,我不得不仅禁用“Qt::ItemIsDropEnabled”“if (index.isValid())”。否则,我根本无法掉落任何东西,即使是在物品之间。这里是 Qt 5.9。 (2认同)