C++ 如何正确读取触摸事件并在QQt上获得位置

C++ 如何正确读取触摸事件并在QQt上获得位置,c++,qt,c++11,qt5,C++,Qt,C++11,Qt5,我正在尝试为qt中的android应用程序开发游戏控制器,但遇到了一些问题。当我只使用QMouseEvents而不是qtoucheEvents时,控制器工作得非常好,但问题是它不支持多个接触点。对于触摸事件,似乎没有QWidget::MousePresseEvent的等价物。我被告知要使用QWidget::event bool GameController::event(QEvent* event) { switch(event->type()) { case QE

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

编译器可能不知道这是触控事件,但只要您知道,您就可以向下转换:

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

当然,运行时检查需要花费一些CPU周期,所以除非需要,否则不要使用
动态强制转换。

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

QWidget::event()
本身是通过
QObject::eventFilter()
virtual方法实现的。你可以在这里阅读更多关于它的信息-。通过
bool eventFilter(QObject*obj,QEvent*ev)override
的帮助,您可以获得有关通过使用发送到您的
QObect
以及其他对象的所有
QEvent
的通知

QObject::eventFilter()
的实现主体中,检查事件的类型及其接收器,然后执行@Jeremy Friesner所述的
静态\u cast
动态\u cast
,以访问特定于该事件的方法。如果希望子类的
QObject
在发生事件时发出信号,则可以使用此强大的机制实现自己的专用事件函数以及自定义信号

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