我在触摸控制的环境中使用QLineEdit字段,这就是为什么我的问题有点奇怪。在这种情况下,用户可能在QLineEdit输入字段中键入了一些非法数据,在纠正非法输入之前,不应允许用户离开此输入字段。
现在,当我检查QLineEdit的焦点丢失事件时,已经太晚了。此事件是在单击其他按钮时发送的,但此时该按钮已被处理,并且使用了我的输入字段中可能错误的数据。
那么我该如何解决这个问题呢?是否有可能将焦点锁定在某个元素上,以便在释放该锁定之前无法使用所有其他小部件(禁用所有其他小组件不是解决方案)?
或者,是否存在某种预聚焦事件,我可以将该事件禁止到其他小部件,并保持我的输入字段处于活动状态并专门聚焦?
谢谢!
解决方案很复杂,但您应该考虑一下…
我建议您创建一个状态机来处理所有GUI元素的启用/禁用属性。当编辑字段获得焦点时,您应该禁用所有其他可能接受输入的小部件。在文本更改事件中,您应该验证数据,如果数据正确,则恢复启用的属性。
一些伪代码:
enum States { LockedState, NormalState };
class Validator
{
signals:
void valid();
void invalid();
slots:
void onTextChanged( QString text );
};
class Gui
{
public:
void initStateMachine();
Validator *_validator;
}
void Gui::initStateMachine()
{
_validator = new Validator();
QVector< QState * > _states;
_states.push_back( new QState() );
_states.push_back( new QState() );
// States
_states[LockedState]->assignProperty( ui->okbutton, "enabled", false );
_states[LockedState]->assignProperty( ui->cancelbutton, "enabled", false );
_states[LockedState]->assignProperty( ui->custombutton, "enabled", false );
_states[NormalState]->assignProperty( ui->okbutton, "enabled", true );
_states[NormalState]->assignProperty( ui->cancelbutton, "enabled", true );
_states[NormalState]->assignProperty( ui->custombutton, "enabled", true );
// Transitions
_states[LockedState]->addTransition( _validator, SIGNAL( valid() ), _states[NormalState] );
_states[NormalState]->addTransition( _validator, SIGNAL( invalid() ), _states[LockedState] );
// Go
for ( auto s : _states )
_stateMachine->addState( s );
_stateMachine->setInitialState( _states[NormalState] );
_stateMachine->setRunning( true );
connect( ui->textEdit, &textChanged, _validator, &onTextChanged );
}
如果您需要详细信息,请随时询问。