2

Qtステートマシンに問題があります。状態を実行することはできません。さまざまな種類のエラーが発生し、何が問題なのか理解できません。エラーとその原因となるコードの詳細については、以下を参照してください。

これが私の主な機能です。

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.

最後の1つは、初期状態を明示的に記述してからms1呼び出すstartため、奇妙です。そのため、そこで何が問題になっているのかわかりません。この例を機能させる方法について誰かが何かアイデアを持っていますか?

4

1 に答える 1

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();
};

これは問題なく機能しています。

于 2013-02-05T18:58:17.317 に答える