繁体   English   中英

如何正确读取触摸事件并在 QWidget Qt 上获取 position

[英]How to properly read touch events and get position on a QWidget Qt

我正在尝试为 qt 中的 android 应用程序开发游戏 controller,但遇到了一些问题。 当我只使用 QMouseEvents 而不是 QTouchEvents 时,controller 工作得很好,但问题是它不支持多点接触。 对于触摸事件,QWidget::mousePressEvent 似乎没有等效项。 有人告诉我使用 QWidget::event 代替。

bool GameController::event(QEvent* event)
{
    switch(event->type())
    {
    case QEvent::TouchBegin: 
         //Do something...
         break;
    case QEvent::TouchEnd: 
         //Do something else...
         break;
    case QEvent::TouchUpdate:
         //Do something else...
         break;
    }
    return QWidget::event(event);
}

这个问题是我无法使用 event->touchPoints() 来获取触摸的 position,因为它不知道它是一个触摸事件。 如何正确读取触摸事件?

编译器可能不知道这是一个触摸事件,但只要知道,就可以向下转型:

case QEvent::TouchBegin:
{
   QTouchEvent * te = static_cast<QTouchEvent *>(event);
   // now you can call te->touchPoints(), etc here
}

请注意,如果event实际上并未指向QTouchEvent (或其子类),则上述代码将调用未定义的行为,因此仅当您可以 100% 保证该event实际上是static_cast (AFAIK 在这种情况下您可以).

对于不能保证向下转换有效的情况,您可以使用dynamic_cast代替,它足够智能以检查指向对象并返回NULL如果向下转换为该类型实际上无效:

case QEvent::TouchBegin:
{
   QTouchEvent * te = dynamic_cast<QTouchEvent *>(event);
   if (te)
   {
      // now you can call te->touchPoints(), etc here
   }
}

当然,运行时检查会占用几个 CPU 周期,所以除非需要,否则不要使用dynamic_cast

QWidget 的各种类型事件的所有受保护函数/事件处理程序(例如QWidget QWidget::showEvent(QShowEvent*)QWidget::hideEvent(QHideEvent*) )都是通用QWidget::event()方法的专门化,以方便您使用.

QWidget::event()本身是通过QObject::eventFilter()虚方法实现的。 您可以在此处阅读更多相关信息 - https://doc.qt.io/qt-5/qobject.html#eventFilter 通过bool eventFilter(QObject *obj, QEvent *ev) override的帮助,您可以获得有关发送到您的QEvents以及通过使用QObject::installEventFilter()发送到其他对象的所有 QEvent 的QObect

QObject::eventFilter()的实现主体中,您检查事件的类型及其接收者,然后按照@Jeremy Friesner 的描述执行static_castdynamic_cast以访问特定于该事件的方法。 使用这种强大的机制,如果您希望您的子类QObject在发生事件时发出信号,您可以实现您自己的专用事件函数以及自定义信号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM