я пытаюсь использовать жесты на IOS с QT, как это:
#ifndef SWIPESTACKWIDGET_H
#define SWIPESTACKWIDGET_H
#include <QStackedWidget>
#include <QSwipeGesture>
class SwipeStackWidget : public QStackedWidget
{
Q_OBJECT
public:
explicit SwipeStackWidget(QWidget *parent = 0);
bool event(QEvent *event);
bool gestureEvent(QGestureEvent *event);
void swipeTriggered(QSwipeGesture *gesture);
signals:
public slots:
};
#endif // SWIPESTACKWIDGET_H
а также
#include "swipestackwidget.h"
#include <QDebug>
SwipeStackWidget::SwipeStackWidget(QWidget *parent) :
QStackedWidget(parent)
{
setAttribute(Qt::WA_AcceptTouchEvents);
grabGesture(Qt::TapGesture);
grabGesture(Qt::TapAndHoldGesture);
grabGesture(Qt::PanGesture);
grabGesture(Qt::PinchGesture);
grabGesture(Qt::SwipeGesture);
}
bool SwipeStackWidget::event(QEvent *event)
{
if (event->type() == QEvent::Gesture)
return gestureEvent(static_cast<QGestureEvent*>(event));
return QWidget::event(event);
}
bool SwipeStackWidget::gestureEvent(QGestureEvent *event)
{
qDebug() << "gestureEvent():" << event->gestures().size();
if (QGesture *swipe = event->gesture(Qt::SwipeGesture))
swipeTriggered(static_cast<QSwipeGesture *>(swipe));
if (QGesture *pan = event->gesture(Qt::PanGesture))
qDebug() << "Pan";
if (QGesture *pinch = event->gesture(Qt::PinchGesture))
qDebug() << "Pinch";
if (QGesture *pinch = event->gesture(Qt::TapGesture))
qDebug() << "Tap";
if (QGesture *pinch = event->gesture(Qt::TapAndHoldGesture))
qDebug() << "Tapandhold";
return true;
}
void SwipeStackWidget::swipeTriggered(QSwipeGesture *gesture)
{
qDebug() << "swipeTriggered()";
if (gesture->state() == Qt::GestureFinished) {
if (gesture->horizontalDirection() == QSwipeGesture::Left) {
qDebug() << "swipeTriggered(): swipe to previous";
setCurrentIndex( std::max( 0, currentIndex()-1) );
} else if (gesture->horizontalDirection() == QSwipeGesture::Right) {
qDebug() << "swipeTriggered(): swipe to next";
setCurrentIndex( std::min( count()-1, currentIndex()+1) );
}
update();
}
}
Я могу скомпилировать код и выполнить его на iphone. Я получаю вкладки жесты и TabAndHold надежно. Пан и Пимч случаются иногда. Размах является большой проблемой:
Кто-нибудь имеет опыт работы с QGestures на ios и может мне помочь?
Мой тестовый класс используется непосредственно в главном окне, и я также использую команду grabGestures в главном окне, но я не управляю жестами там.
Я могу подтвердить, что это требует трех пальцев. Я тестировал с PyQt, Qt5.3.1, на iPad. (Также для сковороды требуются два пальца.)
Я подозреваю, что Qt разработал его таким образом, поэтому он одинаков для всех платформ (выбирая число пальцев, которое является общим в Ubuntu, поскольку Canonical, возможно, внесла большую часть кода?)
В iOS SDK некоторые базовые классы жестов настраиваются для количества пальцев и направлений. Прочитайте больше. Это актуально только потому, что это означает, что Qt мог легко настроить собственные жесты, на которые подписывается Qt, если они подписываются на собственные жесты. Вы можете посмотреть на код Qt (для абстракции QPA платформы iOS и в другом коде, связанном с жестами), чтобы убедиться, что они разработали 3 пальца для удара (что это не ошибка).
Но физический жест с 3 пальцами в направлении вверх на платформах iOS должен означать «скрыть приложение и показать системный трей»? (Это мой опыт, я не могу цитировать iOS HIG и не знаю, чего требует App Store.) Если это так, то приложение должно подписаться на жест Qt Swipe и следовать рекомендациям.
Но вы могли бы также реализовать распознаватель в Qt для считывания одним пальцем?