捕获Qt中的拖动取消事件

Catching drag cancel event in Qt

本文关键字:取消 事件 拖动 Qt 捕获      更新时间:2023-10-16

我在Qt中捕获应用程序范围事件时遇到了一些困难。

我的目的是捕捉某些GUI应用程序中的每个用户操作。当然,我已经覆盖了QApplication::notify处理程序,并在那里处理不同类型的应用程序范围事件。类似的东西:

bool CoolApplication::notify(QObject *obj, QEvent *e)
{
    switch (e->type()) {
    case QEvent::MouseButtonPress:
    case QEvent::MouseButtonRelease:
        // Handle mouse
        break;
    case QEvent::Wheel:
        // Handle wheel
        break;
    case QEvent::KeyPress:
    case QEvent::KeyRelease:
        // Handle keyboard and so on
        break;
    default:
        break;
    }
    return QApplication::notify(obj, e);
}

在用户开始拖放操作之前,这种操作效果非常好。鼠标按下事件处理得很好,它在我的处理程序中被捕获,那里的生活很美好。当我试图在Windows上捕捉鼠标释放事件时,问题就开始了。

当输入拖动操作时,鼠标和键盘事件不再由QApplication::notify处理。当drop事件成功时,可以捕获它(我可以将case QEvent::Drop分支添加到我的处理程序中),但如何用Esc捕获被忽略的drop或取消drop?这似乎不可能直接完成,也许我可以捕捉拖动事件循环终止事件或类似的事件?甚至可能有人知道直接的方法?

编辑:再次将注意力转向我需要捕捉应用程序范围事件,而不是小部件一

请尝试这个

bool QtCoreApplication::notify(QObject *obj, QEvent *e)
    {
        switch (e->type()) {
        case QEvent::QDropEvent:
            QDropEvent* dropEvent = (QDropEvent*)e;
            dropEvent->keyboardModifiers(); // keys pressed
            dropEvent->dropAction(); // Drop result
        break;
        return QApplication::notify(obj, e);
    }

由于这对我们来说仍然是一个悬而未决的问题,我们检查了destroyed信号的使用情况。这是在元素被丢弃的那一刻发射的,这似乎发生在QDrag被Escape键压力杀死的那一瞬间

void dragDestroyed()
{
    qDebug("drag and drop cancled by Escape key");
}

QDrag *drag = new QDrag(this);
connect( drag, SIGNAL(destroyed()), this, SLOT(dragDestroyed()) );
drag->exec(Qt::MoveAction); 

这可能与任何面临这个问题的人有关。