Factorial States Example▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include <QtCore>
#include <stdio.h>
class
Factorial : public
QObject
{
Q_OBJECT
Q_PROPERTY(int
x READ x WRITE setX)
Q_PROPERTY(int
fac READ fac WRITE setFac)
public
:
Factorial(QObject *
parent =
0
)
:
QObject(parent), m_x(-
1
), m_fac(1
)
{
}
int
x() const
{
return
m_x;
}
void
setX(int
x)
{
if
(x ==
m_x)
return
;
m_x =
x;
emit xChanged(x);
}
int
fac() const
{
return
m_fac;
}
void
setFac(int
fac)
{
m_fac =
fac;
}
Q_SIGNALS
:
void
xChanged(int
value);
private
:
int
m_x;
int
m_fac;
}
;
class
FactorialLoopTransition : public
QSignalTransition
{
public
:
FactorialLoopTransition(Factorial *
fact)
:
QSignalTransition(fact, SIGNAL(xChanged(int
))), m_fact(fact)
{}
bool
eventTest(QEvent *
e) override
{
if
(!
QSignalTransition::
eventTest(e))
return
false
;
QStateMachine::
SignalEvent *
se =
static_cast
&
lt;QStateMachine::
SignalEvent*&
gt;(e);
return
se-&
gt;arguments().at(0
).toInt() &
gt; 1
;
}
void
onTransition(QEvent *
e) override
{
QStateMachine::
SignalEvent *
se =
static_cast
&
lt;QStateMachine::
SignalEvent*&
gt;(e);
int
x =
se-&
gt;arguments().at(0
).toInt();
int
fac =
m_fact-&
gt;property("fac"
).toInt();
m_fact-&
gt;setProperty("fac"
, x *
fac);
m_fact-&
gt;setProperty("x"
, x -
1
);
}
private
:
Factorial *
m_fact;
}
;
class
FactorialDoneTransition : public
QSignalTransition
{
public
:
FactorialDoneTransition(Factorial *
fact)
:
QSignalTransition(fact, SIGNAL(xChanged(int
))), m_fact(fact)
{}
bool
eventTest(QEvent *
e) override
{
if
(!
QSignalTransition::
eventTest(e))
return
false
;
QStateMachine::
SignalEvent *
se =
static_cast
&
lt;QStateMachine::
SignalEvent*&
gt;(e);
return
se-&
gt;arguments().at(0
).toInt() &
lt;=
1
;
}
void
onTransition(QEvent *
) override
{
fprintf(stdout, "%d
\n
"
, m_fact-&
gt;property("fac"
).toInt());
}
private
:
Factorial *
m_fact;
}
;
int
main(int
argc, char
**
argv)
{
QCoreApplication app(argc, argv);
Factorial factorial;
QStateMachine machine;
QState *
compute =
new
QState(&
amp;machine);
compute-&
gt;assignProperty(&
amp;factorial, "fac"
, 1
);
compute-&
gt;assignProperty(&
amp;factorial, "x"
, 6
);
compute-&
gt;addTransition(new
FactorialLoopTransition(&
amp;factorial));
QFinalState *
done =
new
QFinalState(&
amp;machine);
FactorialDoneTransition *
doneTransition =
new
FactorialDoneTransition(&
amp;factorial);
doneTransition-&
gt;setTargetState(done);
compute-&
gt;addTransition(doneTransition);
machine.setInitialState(compute);
QObject::
connect(&
amp;machine, &
amp;QStateMachine::
finished, &
amp;app, QCoreApplication::
quit);
machine.start();
return
app.exec();
}
#include
"main.moc"