我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
事件。
答案 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
}