【问题标题】:How to properly read touch events and get position on a QWidget Qt如何正确读取触摸事件并在 QWidget Qt 上获取位置
【发布时间】:2021-02-25 00:23:45
【问题描述】:

我正在尝试为 qt 中的 android 应用程序开发游戏控制器,但遇到了一些问题。当我只使用 QMouseEvents 而不是 QTouchEvents 时,控制器工作得非常好,但问题是它不支持多个接触点。触摸事件的 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() 来获取触摸的位置,因为它不知道它是一个触摸事件。如何正确读取触摸事件?

【问题讨论】:

    标签: c++ qt c++11 qt5


    【解决方案1】:

    为方便起见,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 的通知,这些QEvents 通过使用QObject::installEventFilter() 发送到您的QObect 以及其他对象。

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

    【讨论】:

      【解决方案2】:

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

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

      请注意,如果event 实际上并未指向QTouchEvent(或其子类),则上面的代码将调用未定义的行为,因此只有在可以100% 保证event 是实际上是一个 QTouchEvent(在这种情况下你可以 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多