2013-02-05 2 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 호출 할 것으로 예상) 브레이크 포인트 타격 만나지과 start/stop 방법이 실행되지 않습니다. 응용 프로그램은 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 '' 

I했습니다도 그냥 생성자를 떠나 machine.addState를 호출하지하려고 :

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

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

마지막에게 :

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 

그러나이 경우 나는 다음과 같은 오류를 얻을 수 내가 명시 적으로 초기 상태를 ms1으로 명시하고 나서 start이라고 부르기 때문에 이상한 점이있어서 거기에 어떤 문제가 있는지 알지 못합니다. 이 예제가 어떻게 작동하는지에 대한 아이디어가 있습니까?

+0

전환을 추가하기 전에 상태를 상태 시스템에 추가해 보았습니까? – Jay

답변

2

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

.

+0

감사합니다, 그 작품! 내가 그것을 썼을 때 나는'QStateMachine' 슬롯을보고 있었음에 틀림 없다. – Kiril

+0

내 기쁨! 또한, "최종 상태 ('QFinalState')가 입력되면 상태는'QState :: finished()'신호를 내 보냅니다. 왜냐하면"finished() "를 내보낼 필요가 없다고 생각합니다. –

+0

Yah, 나는 그것을 알아 차렸다. .. 매력처럼 작동한다 :) – Kiril