我有一个附有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函数调用。感谢任何帮助,因为我一遍又一遍地阅读文档,我显然遗漏了一些东西。
答案 0 :(得分:1)
我认为这是因为您还需要重新实现dragMoveEvent(QDragMoveEvent*)
方法。否则,每个项目将独立声明他们不能接受丢弃。