无法捕获TapAndHoldGesture

时间:2015-12-15 16:35:08

标签: qt gesture

grabGesture()编了一个按钮:

buttons[0]->grabGesture(Qt::TapAndHoldGesture);

在构造函数中,并声明:

bool event(QEvent *event);
protected slots

,并按照以下方式实施:

bool MyClass::event(QEvent *event)
{
    if (event->type() == QEvent::Gesture){
        QGestureEvent *gestevent = static_cast<QGestureEvent *>(event);
        if (QGesture *gest = gestevent->gesture(Qt::TapAndHoldGesture)){
            QTapAndHoldGesture *tapgest = static_cast<QTapAndHoldGesture *>(gestevent->gesture(Qt::TapAndHoldGesture));
            cout << "grabbed a gesture event" << endl;
        }
        return true;
    }
    cout << "not a gesture event" << endl;
    return QWidget::event(event);
}

并且我不断向屏幕上打印“不是手势事件”但是我按下(正常按/长按/ ...)

我要做的是长按键(来自键盘)

Qt文档中说:

  

手势可以是鼠标,触摸屏的特定动作   行动,或来自其他来源的一系列事件。的性质   输入,手势的解释和采取的行动是   选择开发者。

所以我想键盘也可以触发QGesture事件。

1 个答案:

答案 0 :(得分:0)

如果处理grap(MyClass)事件的类不是检测到手势的类(QPushButton假设buttons[0]QPushButton),那么你需求和事件过滤器:

buttons[0]->grabGesture(Qt::TapAndHoldGesture);
buttons[0]->installEventFilter( myClass ); // myClass being a MyClass instance

现在,myClass对象将转发buttons[0]的所有事件,这是使用QObject::eventFilter虚函数完成的:

bool MyClass::eventFilter(QObject *obj, QEvent *event)
{
    if ( event->type() == QEvent::Gesture && obj == buttons[0] )
    {
        QGestureEvent *gestevent = static_cast<QGestureEvent *>(event);
        if (QGesture *gest = gestevent->gesture(Qt::TapAndHoldGesture)){
            QTapAndHoldGesture *tapgest = static_cast<QTapAndHoldGesture *>(gestevent->gesture(Qt::TapAndHoldGesture));
            cout << "grabbed a gesture event" << endl;
            return true;
        }
    }
    // standard event processing
    return Parent::eventFilter(obj, event); // Parent being MyClass parent type, maybe QDialog or QWidget
}