Событие QEvent::Drop никогда не генерируется для окна QQuickView

Я борюсь с проблемой, что событие QEvent::Drop никогда не генерируется для моего окна QQuickView.

Мне нужно реализовать функцию перетаскивания, чтобы перетаскивать файлы из проводника в папку QQuickView.

Как описано в этом сообщении, я установил фильтр событий для объекта QQuickView и в методе eventFilter() пытается поймать необходимые события. QEvent::DragMove генерируется, как и ожидалось, когда я перетаскиваю файл поверх представления. Но когда я помещаю файл в представление, QEvent::Drop не создается. Вместо этого генерируется QEvent::DragLeave.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    Filter f;
    QQuickView *view = new QQuickView;
    view->installEventFilter(&f);
    view->show();

    return a.exec();
}

А вот код класса (Event)Filter: (заголовок)

class Filter : public QObject
{
    Q_OBJECT
public:
    Filter(){};
    virtual bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE;
};

(источник)

bool Filter::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type() == QEvent::DragMove)
        qDebug() << "it's a drag";
    if(event->type() == QEvent::Drop)
        qDebug() << "it's a drop"; // <<-- Never reaches here
    return QObject::eventFilter(watched, event);
}

person Vaska el gato    schedule 19.04.2017    source источник


Ответы (1)


С этим вопросом мне помогли коллеги. Очевидно, вам нужно добавить элемент DropArea в корневой файл QML, и после этого QQuickView начнет получать события QEvent::Drop. Однако я не могу найти никакой документации по этому делу, и мне также интересно, какое было бы более общее решение для этого, если бы вместо этого у вас был класс QWindow. В любом случае, я закрываю этот вопрос.

person Vaska el gato    schedule 20.04.2017