[Qt-interest] Using QStateMachine in large apps (Was qscxml and Qhttp)
NoRulez
norulez at me.com
Fri Oct 22 09:36:21 CEST 2010
Hello,
I had a question to the current discussion.
Is in the near future a SCXML editor for qt creator or standalone planned?
Thanks in advance
Best Regards
NoRulez
Am 22.10.2010 um 08:28 schrieb noam.rosenthal at nokia.com:
> Hi Stephen.
> Yes, QScxml is meant for implementing the state machine in XML+QtScript, while scc is meant to generate QStateMachine C++ files from SCXML.
> The scc one provides better support for different types of QEvent, while the QScxml one is more flexible because it uses Javascript.
>
> To implement something like what you're looking for in QScxml, I'd look closely at the blackjack and calculator examples.
> I think that in QScxml, what you're asking for would be implemented something like this:
>
> <scxml>
> <state id="no_selection">
> <onentry><script>myObject.something = 9;</script></onentry>
> <transition target="single_selection" event="q-signal:myObject.selectionChanged(eventType)" cond="_event.data[0]==1"></transition>
> </state>
> <state id="singla_selection">
> <onentry><script>myObject.something = 42;</script></onentry>
> <transition target="single_selection" event="q-signal:myObject.selectionChanged(eventType)" cond="_event.data[0]==2"></transition>
> </state>
> </scxml>
>
> It's a bit different from subclassing transitions - SCXML works more on the concept of events+conditions than on an object oriented concept.
> But I truly urge you to take some time with the examples, they're the best documentation.
>
> Hope this helps,
> ~No'am
> ________________________________________
> From: qt-interest-bounces at trolltech.com [qt-interest-bounces at trolltech.com] On Behalf Of ext Stephen Kelly [steveire at gmail.com]
> Sent: Friday, October 22, 2010 1:59 AM
> To: qt-interest at trolltech.com
> Subject: [Qt-interest] Using QStateMachine in large apps (Was qscxml and Qhttp)
>
> noam.rosenthal at nokia.com wrote:
>
>> Actually, the problem is the build order
>> You have to make install scc before you can compile the examples under
>> examples/scc. That's because the stuff under examples/scc requires scc.prf
>> to be installed in [QTDIR]/mkspecs/features.
>>
>> So:
>>
>> cd scc
>> [QTDIR]/bin/qmake
>> make install
>>
>> cd ..
>> make
>
> Thanks for that. I managed to build the module and build and try the
> examples. They seem to work well. I tried make docs, but that didn't work,
> so I tried cd doc && qdoc scxml.qocconf, which also did nothing useful (I
> don't really know how to use qdoc), so I just read the doc source.
>
> I'm new to QStateMachine and am planning to use it in kontact-mobile and
> another large project. I just read through the docs a couple of days ago. I
> was wondering if there was a better way to maintain the state machine than
> in C++ code. I thought at first that qscxml would be the answer, and it
> might be. Maybe you can clarify. It seems to aimed towards implementing the
> state machine in xml+QtScript.
>
> My aim is to implement my own transition class so that I can change states
> based on selections in a QItemSelectionModel. Such a thing would be defined
> in a header file which could be specified in a similar way to how they are
> specified in .ui files.
>
> Given that, I'd do something like this (and I know it's not valid scxml :)):
>
> <statemachine>
> <state id="no selection"
> object="myObject"
> property="something"
> value="9" />
> <state id="single selection"
> object="myObject"
> property="something"
> value="42" />
> <transition type="ModelSelectionTransition"
> definition="modelselectiontranstion.h"
> from="no selection"
> to="single selection">
> <property name="mode" value="SingleSel" />
> </transition>
> </statemachine>
>
> the ModelSelectionTransition class would set up the connection to the
> selectionChanged signal and would implement the logic of whether to run the
> transition for a particular value in the selectionChanged.
>
> So the above would generate code something like this:
>
> QObject *myObject = getSomeObject();
> myObject->setObjectName("myObject");
>
> QStateMachine machine;
> QState *noSel = new QState();
> noSel->assignProperty(myObject, "something", 9);
> QState *singleSel = new QState();
> singleSel->assignProperty(myObject, "something", 42);
>
> ModelSelectionTransition *tr = new ModelSelectionTransition(SingleSel);
> tr->setTargetState(singleSel);
> noSel->addTransition(tr);
>
> where ModelSelectionTransition is something like
>
> class ModelSelectionTransition
> {
>
> bool eventTest(QEvent *e)
> {
> if (m_type == SingleSel)
> // if the selection model has only one item, accept it.
> if (m_type == MultiSel)
> // ...
> }
>
> };
>
> The engine for the scxml description would need to have a Context to inject
> the myObject into it etc. It looks like QScxml::registerObject does exactly
> that. What is the RightWay to use qscxml to what I'm trying to achieve?
>
> Sorry for the brain-dump post. I haven't written any code for this yet, only
> read documentation so far. Hope I got it right.
>
> All the best,
>
> Steve.
>
>
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
More information about the Qt-interest-old
mailing list