在Qt中捕获拖动取消事件

时间:2014-10-18 19:50:51

标签: c++ windows qt drag-and-drop

我在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取消丢弃?似乎不可能直接完成,也许我可以捕获拖动事件循环终止事件或类似的东西?或者甚至有人知道直接的方法吗?

编辑: 再次转移我需要捕获应用程序范围事件的注意力,而不是小部件

1 个答案:

答案 0 :(得分:0)

请试试这个

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);
    }