拖放到QTreeView中的QStandardItemModel无法正常工作

时间:2012-05-16 00:14:44

标签: qt drag-and-drop

我有一个附有QStandardItemModel的QTreeView。我试图从外部源启用拖放。我已经完成了拖放文档中提到的所有内容以及项目视图的拖放操作,但事情不能正常工作。当我尝试将文件拖到树视图上时,该图标上总是有一个X表示丢弃不可用。 (我使用OS X,我不知道图标看起来像是什么样的窗口)。我希望能够放弃某些项目,但在我掌握基础知识之前,我无法对该功能进行编码。

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

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函数调用。感谢任何帮助,因为我一遍又一遍地阅读文档,我显然遗漏了一些东西。

1 个答案:

答案 0 :(得分:1)

我认为这是因为您还需要重新实现dragMoveEvent(QDragMoveEvent*)方法。否则,每个项目将独立声明他们不能接受丢弃。