Skip to content

Instantly share code, notes, and snippets.

@jniemann66
Last active August 12, 2019 00:35
Show Gist options
  • Save jniemann66/50f7fcf2b2961a2ed3d807566265924e to your computer and use it in GitHub Desktop.
Save jniemann66/50f7fcf2b2961a2ed3d807566265924e to your computer and use it in GitHub Desktop.
Qt Generic Drag and Drop event filter
#include <QDragEnterEvent>
#include "dragdropfilter.h"
bool DragDropFilter::eventFilter(QObject* obj, QEvent* event)
{
auto w = qobject_cast<QWidget*>(obj);
if(w == nullptr) {
return true;
}
QString highlightColor = w->palette().color(QPalette::Highlight).name(QColor::HexRgb);
QString selectedSS = QString{"background-color:%1;"}.arg(highlightColor);
switch (event->type()) {
case QEvent::DragEnter:
{
w->setStyleSheet(selectedSS);
auto dragEnterEvent = static_cast<QDragEnterEvent*>(event);
dragEnterEvent->acceptProposedAction();
emit dragEntered(dragEnterEvent->mimeData());
break;
}
case QEvent::DragMove:
{
auto dragMoveEvent = static_cast<QDragMoveEvent*>(event);
dragMoveEvent->acceptProposedAction();
break;
}
case QEvent::DragLeave:
{
w->setStyleSheet("");
auto dragLeaveEvent = static_cast<QDragLeaveEvent*>(event);
dragLeaveEvent->accept();
emit dragDeparted();
break;
}
case QEvent::Drop:
{
w->setStyleSheet("");
auto dropEvent = static_cast<QDropEvent*>(event);
dropEvent->acceptProposedAction();
emit dragDropped(dropEvent->mimeData());
break;
}
default:
return QObject::eventFilter(obj, event);
}
return true;
}
#include <QObject>
#include <QMimeData>
class DragDropFilter : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
signals:
void dragEntered(const QMimeData* mimeData);
void dragDropped(const QMimeData* mimeData);
void dragDeparted();
};
@jniemann66
Copy link
Author

usage:
auto dragDropHandler = new DragDropFilter;
someWidget->installEventFilter(dragDropHandler);
someWidget->setAcceptDrops(true);

// connect signals & slots
connect(dragDropHandler, &DragDropFilter::dragDropped, this, [this](const QMimeData* mimeData){}); // etc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment