锁定/保持焦点在输入元素上



我在触摸控制的环境中使用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 );
}

如果您需要详细信息,请随时询问。

相关内容

  • 没有找到相关文章