Qt Drag and Drop работает в окне.Могу ли я сделать так, чтобы я мог попасть только в Qlabel, а не во все окно? - PullRequest
1 голос
/ 05 июня 2019

Использование Qt для создания приложения, которое принимает удаление файла. У меня есть область в моем пользовательском интерфейсе, в которую я хочу перетащить файл, используя Qlabel. У меня есть функция перетаскивания файла в пользовательский интерфейс, но я могу поместить его в любое место окна, а не только в область Qlabel.

Я думал, используя

ui->label_drag->setAcceptDrops(true);

будет работать, однако это просто убрало всю функциональность. Каков наилучший способ справиться с этим? если вообще возможно.

Спасибо

1 Ответ

0 голосов
/ 05 июня 2019

Лучший способ сделать это - переопределить класс QLabeldragEnterEvent обязательно вызовите acceptProposedAction для обработки перемещения и выхода из событий.Если вы этого не сделаете, сработает только событие dragEnter.

Ниже приведен пример кода.Чтобы использовать это в своем проекте, добавьте источник в свой проект, а затем щелкните правой кнопкой мыши ярлык на форме и продвиньте элемент на QLabelDragDrop.

#ifndef QLABELDRAGDROP_H
#define QLABELDRAGDROP_H

#include <QLabel>

class QLabelDragDrop : public QLabel
{
    Q_OBJECT
public:
    explicit QLabelDragDrop(QWidget *parent = nullptr);
protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragLeaveEvent(QDragLeaveEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);

signals:

public slots:
};

#endif // QLABELDRAGDROP_H
#include "qlabeldragdrop.h"
#include <QDebug>
#include <QDragEnterEvent>
#include <QDropEvent>

QLabelDragDrop::QLabelDragDrop(QWidget *parent) : QLabel(parent)
{
    setAcceptDrops(true);
    setMouseTracking(true);
}

void QLabelDragDrop::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug() << "dragEnterEvent";
    event->acceptProposedAction();
}

void QLabelDragDrop::dragLeaveEvent(QDragLeaveEvent *event)
{
    qDebug() << "dragLeaveEvent";
    releaseMouse();
}

void QLabelDragDrop::dragMoveEvent(QDragMoveEvent *event)
{
    qDebug() << "dragMoveEvent";
}

void QLabelDragDrop::dropEvent(QDropEvent *event)
{
    qDebug() << "dropEvent";
}
.
...