Tôi có hai tiện ích con có thể được kiểm tra và trường nhập số phải chứa một giá trị lớn hơn 0. Bất cứ khi nào cả hai tiện ích đã được chọn và trường nhập số chứa giá trị lớn hơn 0, nút phải được bật. Tôi đang đấu tranh với việc xác định một máy trạng thái thích hợp cho tình huống này. Cho đến nay tôi có như sau:Làm cách nào để máy trạng thái Qt này hoạt động?
QStateMachine *machine = new QStateMachine(this);
QState *buttonDisabled = new QState(QState::ParallelStates);
buttonDisabled->assignProperty(ui_->button, "enabled", false);
QState *a = new QState(buttonDisabled);
QState *aUnchecked = new QState(a);
QFinalState *aChecked = new QFinalState(a);
aUnchecked->addTransition(wa, SIGNAL(checked()), aChecked);
a->setInitialState(aUnchecked);
QState *b = new QState(buttonDisabled);
QState *bUnchecked = new QState(b);
QFinalState *bChecked = new QFinalState(b);
employeeUnchecked->addTransition(wb, SIGNAL(checked()), bChecked);
b->setInitialState(bUnchecked);
QState *weight = new QState(buttonDisabled);
QState *weightZero = new QState(weight);
QFinalState *weightGreaterThanZero = new QFinalState(weight);
weightZero->addTransition(this, SIGNAL(validWeight()), weightGreaterThanZero);
weight->setInitialState(weightZero);
QState *buttonEnabled = new QState();
buttonEnabled->assignProperty(ui_->registerButton, "enabled", true);
buttonDisabled->addTransition(buttonDisabled, SIGNAL(finished()), buttonEnabled);
buttonEnabled->addTransition(this, SIGNAL(invalidWeight()), weightZero);
machine->addState(registerButtonDisabled);
machine->addState(registerButtonEnabled);
machine->setInitialState(registerButtonDisabled);
machine->start();
Vấn đề ở đây là quá trình chuyển đổi sau:
buttonEnabled->addTransition(this, SIGNAL(invalidWeight()), weightZero);
gây ra tất cả các trạng thái con ở bang registerButtonDisabled
cần được hoàn nguyên trạng thái ban đầu của họ. Đây là hành vi không mong muốn, vì tôi muốn các trạng thái a
và b
duy trì trạng thái tương tự.
Làm cách nào để đảm bảo rằng a
và b
vẫn ở trong cùng một trạng thái? Có cách nào khác/tốt hơn vấn đề này có thể được giải quyết bằng cách sử dụng máy nhà nước?
Lưu ý. Có vô số cách (được cho là tốt hơn) để giải quyết vấn đề này. Tuy nhiên, tôi chỉ quan tâm đến một giải pháp sử dụng một máy nhà nước. Tôi nghĩ rằng một trường hợp sử dụng đơn giản như vậy nên được giải quyết bằng cách sử dụng một máy trạng thái đơn giản, phải không?
Có vẻ như mã hóa một quá trình chuyển đổi tùy chỉnh thực sự là con đường để đi đến đây. Tôi là một chút thất vọng rằng đối với một trường hợp sử dụng dường như tầm thường như vậy thực hiện phức tạp là cần thiết :( –