以编程方式验证QLineEdit



我有一个QLineEdit和一个QDoubleValidator,调用QDoubleValidator::setRange将不会验证QLineEdit的当前文本。
我如何通过编程验证(用鼠标工作聚焦和不聚焦)

这是我继承的QDoubleValidator的代码

DoubleValidator::DoubleValidator( QObject* parent ) : 
    Superclass( parent )
{    
}
DoubleValidator::~DoubleValidator()
{
}
void DoubleValidator::fixup ( QString & input ) const
{
    if( input.toDouble() > top() )
    {   
        input = QString::number( top() , 'f' );
    }   
    else if( input.toDouble() < bottom() )
    {   
        input = QString::number( bottom() , 'f' );
    }   
}

和我继承的QLineEdit代码:

DoubleLineEdit::DoubleLineEdit( QWidget* parent ) :
   Superclass( parent )
{
   _validator =  new DoubleValidator( this );
  this->setValidator( _validator );
}

DoubleLineEdit::~DoubleLineEdit()
{
}
void DoubleLineEdit::setRange( double min, double max )
{
    _validator->setRange( min, max, 1000 );
    validate();
}
void DoubleLineEdit::setTop( double top )
{
    _validator->setTop( top );
    validate();
}    
void DoubleLineEdit::setBottom( double bottom )
{
    _validator->setBottom( bottom );
    validate();
}
void DoubleLineEdit::validate()
{
    if( !hasAcceptableInput() )
    {
        cout<<"Validation needed"<<endl;
    }
}

当我调用DoubleLineEdit::setRange()时,DoubleLineEdit的当前文本没有被验证和固定。

DoubleLineEdit* edit = new DoubleLineEdit( this );
edit->setText("100");
edit->setRange( 0, 10);

使用此代码,edit->text()仍将为100,我希望它自动更改为10。

我已经实现了一个工作DoubleLineEdit::validate方法:

void DoubleLineEdit::validate()
{
    if( !hasAcceptableInput() )
    {
        QFocusEvent* e = new QFocusEvent( QEvent::FocusOut );
        this->focusOutEvent( e );
        delete e;
    }
}

但这更像是一种技巧,也许有更好的解决方案。

尝试将validate()函数更改为:

void DoubleLineEdit::validate()
{
   if (!hasAcceptableInput())
   {
       QString t = text();
       _validator->fixUp(t);
       setText(t);
   }
}

相关内容

  • 没有找到相关文章

最新更新