我对 C++ 和 Qt 很陌生,我想开发一种机器控制并通过状态机对过程进行建模。到目前为止,我将我的代码分成不同的 QObjects,这些 QObjects 在不同的 QThreads 中运行,它们通过 QTs 信号/插槽概念进行通信。到目前为止,我一直在使用 QStatemachine 框架,但我怀疑我是否以正确的方式使用它。例如,我创建了一个简单的 StateMachine:
*。H:
class SmTest : public QStateMachine
{
Q_OBJECT
public:
explicit SmTest(QObject *parent = nullptr);
private:
QState* sA;
QState* sB;
QState* sC;
QState* sD;
signals:
void DoSomethingA();
void DoSomethingB();
void DoSomethingC();
public slots:
void onA();
void onB();
void onC();
void onD();
public slots:
};
*.cpp:
SmTest::SmTest(QObject *parent) : QStateMachine(parent)
{
sA = new QState(this);
sB = new QState(this);
sC = new QState(this);
sD = new QState(this);
connect(sA, &QState::entered, this, &SmTest::onA);
connect(sB, &QState::entered, this, &SmTest::onB);
connect(sC, &QState::entered, this, &SmTest::onC);
connect(sD, &QState::entered, this, &SmTest::onD);
sA->addTransition(this, &SmTest::DoSomethingA, sB);
sB->addTransition(this, &SmTest::DoSomethingB, sC);
sC->addTransition(this, &SmTest::DoSomethingC, sD);
this->setInitialState(sA);
}
void SmTest::onA()
{
qDebug() << "onA entered";
emit DoSomethingA();
}
void SmTest::onB()
{
qDebug() << "onB entered";
double rnd = qrand() % 2;
if (rnd > 1)
emit DoSomethingB();
}
void SmTest::onC()
{
qDebug() << "onC entered";
emit DoSomethingC();
}
void SmTest::onD()
{
qDebug() << "onD entered";
}
在这种情况下,我必须为我的 FSM 中的每个转换声明一个信号,并为每个状态声明一个插槽,并相应地连接它们。这在像上面这样的小例子中可能没问题,但如果 FSM 可能包含超过 100 个状态,则会很快变得混乱。
- 有没有办法使用无条件转换?例如
sA->addTransition(sB)
,这意味着 sA 将自动转换为 sB。但是,如果我尝试使用它,它会破坏我的 QStateMachine。如果这是不可能的: - 我对 Boost MSM 框架进行了一些研究,并且喜欢提供的语法和功能(转换表、“无”事件等)。是否有适当的方法将 boost::msm 嵌入 QObject 并能够在
on_entry
boost::msm 的函数中发出该 QObject 的信号?