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