2013-02-05 35 views
2

我遇到了一些问题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,所以我不知道那里有什么问题。有没有人对如何让这个例子起作用有什么想法?

+0

您是否尝试在添加转换之前将状态添加到状态机? – Jay

回答

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

它工作得很好。

+0

谢谢,这工作!当我写这个时,我一定在查看'QStateMachine'插槽。 – Kiril

+0

我的荣幸!另外,我认为没有必要发出'finished()',因为“当输入最终子状态('QFinalState')时,状态发出'QState :: finished()'信号。”。 –

+0

嗯,我注意到...工作就像一个魅力:) – Kiril