拖放到QTreeView中的QStandardItemModel不起作用

问题描述:

我有一个附有QStandardItemModel的QTreeView。我试图启用拖放从外部来源。我已经完成了文档中提到的所有提及拖放和拖放项目视图,但事情并不正确。当我尝试将文件拖到树视图上时,该图标上始终有一个X,表示该放置不可用。 (我使用OS X,我不知道这个图标看起来像是什么窗口)。我希望能够放弃某些项目,但直到我了解基础知识,我无法编写该功能。拖放到QTreeView中的QStandardItemModel不起作用

这里是我的子类的树视图源代码:

MyTreeView::MyTreeView(QWidget *parent) : 
    QTreeView(parent) 
{ 
    setContextMenuPolicy(Qt::CustomContextMenu); 
    setAcceptDrops(true); 
    setDropIndicatorShown(true); 
} 

void MyTreeView::dragEnterEvent(QDragEnterEvent *event) 
{ 
    event->acceptProposedAction(); 
} 

void MyTreeView::dropEvent(QDropEvent *event) 
{ 
    qDebug("I am here"); 
    event->acceptProposedAction(); 
} 

这里是子类的标准产品型号来源:

MyStandardItemModel::MyStandardItemModel(QObject *parent) : 
    QStandardItemModel(parent) 
{ 
} 

Qt::DropActions MyStandardItemModel::supportedDropActions() const 
{ 
    return Qt::CopyAction; 
} 

Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex &index) const 
{ 
    Qt::ItemFlags defaultFlags = QStandardItemModel::flags(index); 

    if (index.isValid()) 
     return Qt::ItemIsDropEnabled | defaultFlags; 
    else 
     return defaultFlags; 
} 

bool MyStandardItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) 
{ 
    qDebug("I am in the model"); 
} 

正如我所说的,图标是告诉我,下降不可用,但如果我放弃它,则会从树视图中打印出“我在这里”文本。但是模型视图中的文字“我在模型中”从来不会被打印出来。我不确定我需要做什么才能让模型识别可用的下拉列表并更改图标,或者让dropMimeData函数调用。任何帮助表示赞赏,因为我一遍又一遍地阅读了文档,而且我明显错过了一些东西。

+0

你必须在你的MyTreeView :: dropEvent()实现中调用'QTreeView :: dropEvent()'。 –

我想这是因为你还需要重新实现dragMoveEvent(QDragMoveEvent*)方法。否则,每个项目将独立宣布他们不能接受放置。