我创建了一个QListView
模型,只需重新排序项目并在重新排序后检索文本信息。我已将QListView
的{{1}}设置为dragMode
。但是,QAbstractItemView::InternalMove
不是在内部拖放操作之后移动项目,而是创建已移动项目的副本。
QStandardListModel
项目(标记为绿色):
下面,“FIPAverageImage”项目被拖动并放置在“FIPGaussianFilter”项目下方。结果在QStandardListModel
的显示中是正常的,但是当您从QListView
的模型中检索数据时会出现问题。
QListView
以下代码用于从QListView模型中读取项目。
#include <iostream>
#include <stdio.h>
#include <QDropEvent>
#include <QPushButton>
#include <QListView>
using namespace std;
DragDropWidget::DragDropWidget(QWidget * parent, std::string strAccessibleName) : QListView(parent) {
setAccessibleName(QString(strAccessibleName.c_str()));
setSelectionMode(QAbstractItemView::SingleSelection);
setDragEnabled(true);
viewport()->setAcceptDrops(true);
setDragDropMode(QAbstractItemView::InternalMove);
setDropIndicatorShown(true);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setDragDropOverwriteMode(false);
setDropIndicatorShown(true);
setMaximumHeight(400);
}
DragDropWidget::DragDropWidget(){;}
DragDropWidget::~DragDropWidget(){;}
void DragDropWidget::dragMoveEvent(QDragMoveEvent *e) {
//Call the Default behaviour
QListView::dragMoveEvent(e);
//Make the QListView to only accept items from another QListViews
if(this->dragDropMode() == QAbstractItemView::DragDrop){
if (e->source() != this) {
e->accept();
}else {
e->ignore();
}
}else{
e->accept();
}
}
void DragDropWidget::dropEvent(QDropEvent* event){
//Call the Default behaviour
QListView::dropEvent(event);
if(this->dragDropMode() == QAbstractItemView::InternalMove){
///BUG, this signal emission causes the shadow copies
emit changeProcessorOrderSignal();
}
}