Невозможно запустить состояние и переход между состояниями: получение различных ошибок

У меня проблемы с 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();
};

Финишер довольно прост:

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Я не знаю, в чем проблема. У кого-нибудь есть идеи, как заставить этот пример работать?

2

Решение

Нет ничего похожего start() слот в QState — но он существует в 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();
};

который работает просто отлично.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]