gpt4 book ai didi

c++ - 无法启动状态和状态之间的转换 : receiving various errors

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:01 24 4
gpt4 key购买 nike

我在使用 Qt State Machine. 时遇到了一些问题我永远无法执行这些状态:我遇到各种类型的错误,但我无法弄清楚问题出在哪里。有关错误和导致这些错误的代码的更多信息,请参阅下文。

这是我的主要功能:

int main(int argc, char *argv[])
{
// Initialize the app
// ... app initialization here
QApplication app(argc, argv);

// Create the state machine
QStateMachine machine;

MyState* ms1 = new MyState("ms1");
MyState* ms2 = new MyState("ms2");
QFinalState* fs = new QFinalState();

ms1->addTransition(ms2);
ms2->addTransition(fs);

machine.addState(ms1);
machine.addState(ms2);
machine.addState(fs);
machine.setInitialState(ms1);

QObject::connect(&machine, SIGNAL(finished()), new Finisher(), SLOT(OnFinished()));
machine.start();
return app.exec();
}

我在 MyState 中设置了断点,但是断点永远不会被击中并且 start/stop 方法永远不会执行(我实际上只期望 start 被调用)。应用程序直接进入 Finisher::OnFinished 方法。

这是我的州级:

class MyState: public QState
{
Q_OBJECT
private:
QString _stateName;
public:
MyState(QString stateName, QState * parent = 0):QState(parent), _stateName(stateName){}
~MyState(){}

public slots:
void start()
{
qDebug() << _stateName << " start.";
emit finished();
}

void stop()
{
qDebug() << _stateName << " stop.";
}

signals:
void finished();
//void exited();
};

Finisher 非常简单:

class Finisher:public QObject
{
Q_OBJECT
public slots:
void OnFinished()
{
qDebug() << "Finished!";
QTimer::singleShot(0, QApplication::instance(), SLOT(quit()));
}
};

我尝试了几种方法,包括直接设置每个状态的父级:

// If I use the following code, I get an error 
// stating that "the state has already been added to this machine"
MyState* ms1 = new MyState("ms1");
MyState* ms2 = new MyState("ms2", ms1);
QFinalState* fs = new QFinalState(ms2);

ms1->addTransition(ms2);
ms2->addTransition(fs);

machine.addState(ms1);
machine.addState(ms2);
machine.addState(fs);
machine.setInitialState(ms1);
// .. and so on

但是,当调用 machine.addState 时似乎无法添加状态:

QStateMachine::addState: state has already been added to this machine
QStateMachine::addState: state has already been added to this machine
Unrecoverable error detected in running state machine: Missing initial state in
compound state ''

我也试过只留下构造函数而不调用 machine.addState:

QStateMachine machine;
MyState* ms1 = new MyState("ms1");
MyState* ms2 = new MyState("ms2", ms1);
QFinalState* fs = new QFinalState(ms2);

ms1->addTransition(ms2);
ms2->addTransition(fs);
machine.setInitialState(ms1);
// .. and so on

但是,在这种情况下,我得到以下错误:

QState::setInitialState: state 0xa05e5e0 is not a child of this state (0x43fe94)

QStateMachine::start: No initial state set for machine. Refusing to start.

最后一个很奇怪,因为我明确地将初始状态声明为ms1,然后调用start,所以我不知道那里有什么问题。有人对如何使这个示例起作用有任何想法吗?

最佳答案

QState 中没有类似start() 槽的东西——但它存在于QStateMachine 中。

我想你想重新实现

virtual void    onEntry ( QEvent * event )
virtual void onExit ( QEvent * event )

方法:

class MyState: public QState
{
Q_OBJECT
private:
QString _stateName;
public:
MyState(QString stateName, QState * parent = 0):QState(parent), _stateName(stateName){}
~MyState(){}

protected:
virtual void onEntry(QEvent * event)
{
qDebug() << _stateName << " start.";
}

virtual void onExit(QEvent * event)
{
qDebug() << _stateName << " stop.";
}
signals:
void finished();
//void exited();
};

工作正常。

关于c++ - 无法启动状态和状态之间的转换 : receiving various errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14712732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com