我在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);
这可能与任何面临这个问题的人有关。