【问题标题】:Catching drag cancel event in Qt在 Qt 中捕获拖动取消事件
【发布时间】:2014-10-18 19:50:50
【问题描述】:

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

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

【问题讨论】:

  • 有 DragEnter 事件,该事件表示用户开始拖动并进入小部件。也许有帮助。
  • @Chernobyl,谢谢,我知道拖动事件的存在,但它们无济于事。我需要拖动终止事件,既不进入也不离开。

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


【解决方案1】:

请试试这个

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

【讨论】:

  • 感谢您的回答,@Krionix,但这不是我需要的。您的提议适用于具体的小部件,但我需要处理应用程序范围的事件。这意味着拖动可以被不同的小部件甚至窗口忽略,我需要知道它被中断的那一刻
  • 好的,现在我明白你的意思了,很抱歉离题的回答。这是因为拖动操作是一个阻塞操作 exec() 并且主事件循环正在等待拖动完成,这就是所有其他事件都没有处理的原因。您需要在您的通知函数中添加“case QEvent::Drop”并询问您的 QDropEvent 是否有任何修饰键 QDropEvent::keyboardModifiers() 并丢弃结果。谢谢。
  • @dvvrd,你在这个问题上是对的,这是一个特定于 Windows 的问题,因为 QDrag::exec 具有平台相关的实现。来自 Qt 源代码:在 Linux 和 Mac OS X 上,拖放操作可能需要一些时间,但此功能不会阻塞事件循环。在执行操作时,其他事件仍会传递给应用程序。在 Windows 上,Qt 事件循环在操作期间被阻塞。
  • 在 Windows 上拖放操作期间没有通用且简单的方法来处理应用程序事件。一种方法是将 QDrag 放置在具有自己的事件循环的单独线程中。但在这种情况下,您需要重新实现所有使用的拖放小部件:(
  • 我看到了如何在 Qt 中实现 windows 拖放。他们只是在 WinAPI 方法中的某处注册回调并以复杂的方式处理它们......解决我的问题的方法之一也是使用 WinAPI,第二种方法 - 以某种方式重用 QWindowsDrag 代码。在这里,我只是在寻找一种漂亮的方法。
猜你喜欢
  • 2011-07-06
  • 2018-09-30
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多