Qwt為拾取操作提供了狀態機器設定,用於控制拾取操作的不同行為。
void setStateMachine( QwtPickerMachine * );
其實現如下:
/*! Set a state machine and delete the previous one \param stateMachine State machine \sa stateMachine()*/void QwtPicker::setStateMachine( QwtPickerMachine *stateMachine ){ if ( d_data->stateMachine != stateMachine ) { reset(); delete d_data->stateMachine; d_data->stateMachine = stateMachine; if ( d_data->stateMachine ) d_data->stateMachine->reset(); }}
這裡其實就是State模式[GOF《設計模式》]的應用。State模式的UML圖如下:
註:配圖來自http://c.chinaitlab.com/cc/basic/200904/781718.html
角色指派:
QwtPicker 相當於UML圖中的Context類;
QwtPickerMachine相當於狀態基類State; 而QwtPickerTrackerMachine, QwtPickerClickPointMachine, QwtPickerDragPointMachine, QwtPickerClickRectMachine, QwtPickerDragRectMachine, QwtPickerPolygonMachine則是具體的狀態子類。
QwtPicker::transition() 相當於Context::Request();
virtual void transition( const QEvent * );
QwtPickerMachine::transition( )相當於Handle();
//! Transition virtual QList<Command> transition( const QwtEventPattern &, const QEvent * ) = 0;
最後給上狀態機器類的繼承關係圖: