我在触控环境中使用QLineEdit字段,这就是为什么我的问题有点奇怪。在某种情况下,用户可能在QLineEdit输入字段中输入了一些非法数据,并且在非法输入被更正之前不应允许离开此输入字段。
现在,当我检查QLineEdit的焦点丢失事件时,为时已晚。此事件在例如发送时发送单击另一个按钮但此时此按钮已处理,并且我的输入字段中可能存在错误的数据。
那我怎么解决这个问题呢?是否有可能将焦点锁定在元素上,以便在释放此锁之前不能使用所有其他小部件(禁用所有其他小部件不是解决方案)?
或者是否存在某种预聚焦事件,我可以将事件抑制到另一个窗口小部件并保持我的输入字段处于活动状态并专注于其中?
谢谢!
答案 0 :(得分:0)
解决方案很复杂,但你应该考虑一下......
我建议您创建一个state machine来处理所有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 );
}
如果您需要详细信息,请随时询问。