QListview在重新排序后留下QStandardItems的卷影副本

时间:2017-11-14 14:23:41

标签: c++ qt qt5

我创建了一个QListView模型,只需重新排序项目并在重新排序后检索文本信息。我已将QListView的{​​{1}}设置为dragMode。但是,QAbstractItemView::InternalMove不是在内部拖放操作之后移动项目,而是创建已移动项目的副本。

重新排序前的

QStandardListModel项目(标记为绿色):

QStandard Model items before reordering

下面,“FIPAverageImage”项目被拖动并放置在“FIPGaussianFilter”项目下方。结果在QStandardListModel的显示中是正常的,但是当您从QListView的模型中检索数据时会出现问题。

QListView

Shadow copy of the moved item, after reordering

以下代码用于从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();
    }
}

0 个答案:

没有答案