带有QListView的QStandardItemModel,外部放置操作不起作用

时间:2012-12-12 11:23:32

标签: qt drag-and-drop qstandarditemmodel

我正在使用Qt 4.2。

我有一个QMainWindow,里面有一个QListView,它使用QStandardItemModel来显示我从.desktop文件中获得的一些项目。

现在我正在尝试对应用程序实施放置操作,以便ex:当.html文件在firefox项目上下载时,我可以运行firefox。

所以这就是我所做的:

- 为listView:

 viewport()->setAcceptDrops(true);
 setAcceptDrops(true);
 setDragEnabled(true);
 setDropIndicatorShown(true);
 setDragDropMode(QListView::DragDrop);

- 用于standardItemModel:

Qt::DropActions supportedDropActions() const {
    return Qt::CopyAction | Qt::MoveAction;
}
Qt::ItemFlags flags(const QModelIndex &index) const {
    return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled |
           Qt::ItemIsDropEnabled | Qt::ItemIsEnabled;
}
QStringList mimeTypes() const {
    QStringList types;
    types<<"text/uri-list";
    return types;
}
bool dropMimeData(const QMimeData *data, Qt::DropAction action,
                  int row, int column, const QModelIndex &parent) {
    qDebug() << "dropMimeData";
}

之后,当我在应用程序上放置一些文件时,我从未收到dropMimeData调试消息。

1 个答案:

答案 0 :(得分:1)

您还需要重新实现dragEnterEvent()dropEvent() - 它们是QListView中的虚拟函数。

来自文档:

  

放弃

     

为了能够接收放在小部件上的媒体,请致电   小部件的setAcceptDrops(true),并重新实现   dragEnterEvent()和dropEvent()事件处理函数。

     

例如,   以下代码在QWidget的构造函数中启用drop事件   子类,使得有用地实现drop事件成为可能   处理程序:

 void Window::dragEnterEvent(QDragEnterEvent *event)
 {
     if (event->mimeData()->hasFormat("text/plain"))
         event->acceptProposedAction();
 }


 void Window::dropEvent(QDropEvent *event)
 {
     textBrowser->setPlainText(event->mimeData()->text());
     mimeTypeCombo->clear();
     mimeTypeCombo->addItems(event->mimeData()->formats());

     event->acceptProposedAction();
 }