Я использую Qt 4.2.

У меня QMainWindow с QListView внутри, который использует QStandardItemModel для отображения некоторых элементов, которые я получаю из файлов .desktop.

Теперь я пытаюсь реализовать действие перетаскивания в приложении, например: я могу запустить firefox, когда файл .html перетаскивается поверх элемента firefox.

Вот что я сделал:

-для listView:

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

-для стандартной моделиItemModel:

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
uDalillu 12 Дек 2012 в 15:23

1 ответ

Лучший ответ

Вам также необходимо переопределить dragEnterEvent() и dropEvent() - это виртуальные функции в QListView.

Из документации:

Падение

Чтобы иметь возможность получать медиа, сброшенные на виджет, вызовите setAcceptDrops (true) для виджета и повторно реализуйте функции обработчика событий dragEnterEvent () и dropEvent ().

Например, следующий код включает события перетаскивания в конструкторе подкласса QWidget, что позволяет с пользой реализовать обработчики событий перетаскивания:

 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();
 }
1
sashoalm 12 Дек 2012 в 17:02