2011-12-15 39 views
7

Tôi đang cố gắng triển khai một máy trạng thái trong Qt (C++). Làm cách nào để kiểm tra trạng thái hiện tại của QStateMachine? Tôi không thể tìm thấy phương thức trong tài liệu.C++ Qt: Kiểm tra trạng thái hiện tại của QStateMachine

thx

+0

Tôi có cùng một vấn đề. Iterating QSet rằng :: cấu hình cung cấp cho tôi QAbstractState đó là không sử dụng rõ ràng. Một ví dụ làm việc sẽ là tuyệt vời. – ExpatEgghead

+0

@ExpatEgghead vui lòng tham khảo http://stackoverflow.com/questions/2533132/how-to-get-this-qt-state-machine-to-work nó có thể giúp bạn –

+0

@ExpatEgghead: Phiên bản Qt của bạn là gì, 4.7 hoặc 4.8 ? – menjaraz

Trả lời

13

bạn đã thử QStateMachine::configuration() chưa?

tham khảo http://www.qtcentre.org/threads/42085-How-to-get-the-current-state-of-QStateMachine

Trích từ url trên:

// QStateMachine::configuration() gives you the current states. 

while(stateMachine->configuration().contains(s2)) 
{ 
    //do something 
} 
+0

Vâng vâng, nhưng khi tôi thử nó không có trạng thái nào tôi đã thêm vào đó. Tôi không có các lớp QState của riêng mình, chỉ là các QState thông thường. – ExpatEgghead

+0

Là một phần của đơn đăng ký của tôi, tôi cần gửi đến máy khác trạng thái hiện tại của ứng dụng. Nó không có vẻ hợp lý để tìm kiếm thông qua một Set cho việc này. Có lẽ sai lầm của tôi đã không tạo ra một lớp dẫn xuất cho tất cả các quốc gia của tôi. – ExpatEgghead

+0

@ExpatEgghead: Tôi tin rằng bạn có thể nhận được nhiều sự chú ý hơn nếu bạn có thể cung cấp tối thiểu một mã hoàn chỉnh minh họa sự cố của bạn. – menjaraz

5

Bạn có thể gán các thuộc tính vào QStateMachine riêng của mình.

// QState  m_State1; 
// QState  m_State2; 
// QStateMachine m_Machine; 

m_State1.assignProperty(m_Label, "visible", false); 
m_State1.assignProperty(&m_Machine, "state", 1); 

m_State2.assignProperty(m_Label,  "visible", true); 
m_State2.assignProperty(&m_Machine, "state", 2); 

Sau đó, trạng thái hiện tại có thể được đọc từ thuộc tính động.

qDebug() << m_Machine.property("state"); 
0

Từ Qt 5.7 Documentation

QSet QStateMachine :: cấu hình() const

Trả về tập quán tối đa của các quốc gia (bao gồm cả các quốc gia song song và cuối cùng) mà máy nhà nước này hiện đang trong. Nếu một trạng thái trong cấu hình, nó luôn luôn là trường hợp cha mẹ của s cũng là trong c. Tuy nhiên, lưu ý rằng bản thân máy không phải là thành viên rõ ràng của cấu hình.

sử dụng Ví dụ:

bool IsInState(QStateMachine& aMachine, QAbstractState* aState) const 
{ 
    if (aMachine_.configuration().contains(aState)) return true; 
    return false 
} 
0

Tôi nhận ra tôi đến vào cuối năm, nhưng hy vọng câu trả lời này sẽ giúp bất kỳ ai khác tình cờ xem qua điều này.

Bạn đã đề cập ở trên mà bạn đã cố gắng sử dụng cấu hình(), nhưng không có trạng thái nào của bạn ở đó - điều này là do start() là không đồng bộ.

Vì vậy, giả sử bạn gọi cấu hình() ngay sau khi gọi bắt đầu(), điều đó có nghĩa là các trạng thái của bạn chưa có. Bạn có thể nhận được các chức năng mà bạn muốn bằng cách sử dụng tín hiệu start() của lớp QStateMachine. Check it out:

stateMachine->setInitialState(someState); 
stateMachine->start(); 
connect(stateMachine, SIGNAL(started()), this, SLOT(ReceiveStateMachineStarted())); 

Sau đó, cho khe ReceiveStateMachineStarted() của bạn, bạn có thể làm một cái gì đó như thế này:

void MyClass::ReceiveStateMachineStarted() { 
    QSet<QAbstractState*> stateSet = stateMachine->configuration(); 
    qDebug() << stateSet; 
} 

Khi máy nhà nước của bạn đi vào trạng thái ban đầu của nó, nó sẽ phát ra start() tín hiệu. Vị trí bạn đã viết sẽ nghe thấy và in cấu hình. Để biết thêm về vấn đề này, hãy xem tài liệu Qt sau:

http://doc.qt.io/qt-5/qstatemachine.html#started

Các vấn đề liên quan