64,648
社区成员
发帖
与我相关
我的任务
分享
QQuickPointerEvent *QQuickPointerTouchEvent::reset(QEvent *event)
{
auto ev = static_cast<QTouchEvent*>(event);
m_event = ev;
if (!event)
return this;
m_device = QQuickPointerDevice::touchDevice(ev->device());
m_button = Qt::NoButton;
m_pressedButtons = Qt::NoButton;
const QList<QTouchEvent::TouchPoint> &tps = ev->touchPoints();
int newPointCount = tps.count();
m_touchPoints.reserve(newPointCount);
for (int i = m_touchPoints.size(); i < newPointCount; ++i)
m_touchPoints.insert(i, new QQuickEventTouchPoint(this));
// Make sure the grabbers are right from one event to the next
QVector<QQuickItem*> grabbers;
// Copy all grabbers, because the order of points might have changed in the event.
// The ID is all that we can rely on (release might remove the first point etc).
for (int i = 0; i < newPointCount; ++i) {
QQuickItem *grabber = nullptr;
if (auto point = pointById(tps.at(i).id()))
grabber = point->grabber();
grabbers.append(grabber);
}
bool b = false;
for (int i = 0; i < newPointCount; ++i) {
auto point = m_touchPoints.at(i);
point->reset(tps.at(i), ev->timestamp());
if (point->state() == QQuickEventPoint::Pressed) {
if (grabbers.at(i))
{
qWarning() << "TouchPointPressed without previous release event" << point;
b = true;
}
point->setGrabber(nullptr);
} else {
point->setGrabber(grabbers.at(i));
}
}
m_pointCount = newPointCount;
if (b)
{
qWarning() << "Re-Send the release event!!";
emit qGuiApp->applicationStateChanged(Qt::ApplicationInactive);
emit qGuiApp->applicationStateChanged(Qt::ApplicationActive);
}
return this;
}