2014-02-17 44 views
1

我创建了QListView和QStringListModel。停止QListView从拖放删除条目

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

的问题是,当你在列表中拖动项目,并尝试将其移动到另一个位置时,它喜欢覆写的项目你:

listModel = new QStringListModel(ui->listView); 
ui->listView->setModel(listModel); 
ui->listView->setEditTriggers(QListView::NoEditTriggers); 
ui->listView->setDragDropMode(QListView::InternalMove); 

而且我使用添加项目将它拖到。我不希望通过拖放操作删除项目。

回答

4

从文档,我们得到一点到哪里寻找在QListView::dragDropOverwriteMode控制覆盖行为暗示的:

注:这是不是为了防止物品覆盖。 模型的执行标志()应该通过不返回Qt :: ItemIsDropEnabled

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

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

所以为了改变这种行为,你将需要自定义模型(即从QStringListModel获得至少),改变flags(const QModelIndex & index) const方法的行为来无回Qt::ItemIsDropEnabled

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

+0

您不必对模型进行子类化。如果你使用QStandardItem模型,你可以创建QStandardItem,设置适当的标志并在setItemPrototype()'''中使用这个项目。 – Michal