[Solved again] Post a QGestureEvent to a QStateMachine
-
wrote on 26 May 2015, 15:15 last edited by Malte J
Hello everybody,
i have a problem when posting QGestureEvents to a QStateMachine.
I implemented custom gesture recognizers, which a correctly registered and now i am receiving QGestureEvents in my application. I then do some processing and afterwards i would like to post one gesture event to my state machine.QList<QGesture *> newGestureList; newGestureList.append(g); if (mp_stateMachine){ QGestureEvent *ev = new QGestureEvent(newGestureList); mp_stateMachine->postEvent(ev); }
So far so good. For Gestures with the state Qt::GestureStarted and Qt::GestureUpdated everything works fine.
Now the problem:
When the gesture has the state Qt::GestureFinished or Qt::GestureCancelled, it gets resetted by Qt, so that in custom transition, i receive the events, but the gestures have the state Qt::NoGesture. That is very critical to me since i need to check the state afterwards.I found out, that in QGestureManager.cpp the cancelled and finished gestures are resetted:
// reset gestures that ended QSet<QGesture *> endedGestures = finishedGestures + canceledGestures + undeliveredGestures + maybeToCanceledGestures; foreach (QGesture *gesture, endedGestures) { recycle(gesture); m_gestureTargets.remove(gesture); }
But I don't know why and how to solve my problem.
Any ideas are welcome!
Thank you in advance,
MalteJ -
Hi and welcome to devnet,
Shouldn't you rather decouple the two ? Handle the gesture in your widget, then send a custom event to your state machine so the machine doesn't need to know QGestureEvent and thus you can also change easily what triggers that custom event.
Hope it helps
-
Hi and welcome to devnet,
Shouldn't you rather decouple the two ? Handle the gesture in your widget, then send a custom event to your state machine so the machine doesn't need to know QGestureEvent and thus you can also change easily what triggers that custom event.
Hope it helps
wrote on 28 May 2015, 09:23 last edited by Malte J@SGaist Thank you for your fast answer.
In fact, I implemented custom gestures, which contain all important information for the decision.
My custom Transition class called GestureTransition triggers according to the specified gesture event.Could I implement a custom event holding a QGesture object? If yes, how?
Thanks, Malte
Edit: I think i got it, subclassing QEvent was not that hard ;) Thank you for the idea!
-
wrote on 28 May 2015, 12:22 last edited by
Okay... i have to reopen this issue.
like @SGaist proposed, I want to post a custom event to my state machine. However, I want this event to hold an instance of the causing QGesture object. Sadly, i see no way of copying such an object, and if I use a pointer, it is the same object that gets killed by Qt in the QGestureManager as said above..
Any ideas to solve this? I have like 8 custom gesture classes that hold different information, which are all subclasses of QGesture (for the information of the QGestureState). And I don't want to miss that..
PS: QGesture(const QGesture &) constructor does not work. It does not copy the state and properties...
-
QGesture is a QObject thus it can't be copied.
I'd make these information separated objects (struct or class) and use them with your new events. This will avoid passing QGesture objects around.
-
QGesture is a QObject thus it can't be copied.
I'd make these information separated objects (struct or class) and use them with your new events. This will avoid passing QGesture objects around.
-
We might be misunderstanding each other. Is it correct that you have some custom data inside your custom gestures ?
If so, what I'm suggesting is to make these custom data easily accessible and copy them to the events you send to the state machine. -
wrote on 28 May 2015, 14:56 last edited by
Yes that is correct. Every of the 8 custom gestures defines its own set of data in addition to the QGestureState, which is set by the according gesture recognizer.
I now implemented an abstract superclass for all these gestures with a method getGestureData(). This method basically wraps all the data in a QMap<QString,QVariant> to make a general gesture treatment possible. The custom event GestureEvent now takes gesture type, the Qt::GestureState and the mentioned gesture data map.
It was a little bit circumstantial, but now it works.Thanks again,
Malte
1/8