天天看点

Qt 解决QLineEdit设置QValidator之后,某些信号不能正常连接的情况

1.QLineEdit

某些时候我们需要限制QlineEdit的输入格式,比如只能输入数字、只能输入英文,这个时候需要设置正则表达式。例:

//设置只能输入数字
QRegExpValidator *pRevalidotor = new QRegExpValidator(QRegExp("[0-9]{20}"), this);
ui.lineEdit->setValidator(pRevalidotor); 
           

在设置QValidator之后,会导致QLineEdit里的信号editingFinished()、returnPressed()等不能正常与外界绑定的槽不能正常连通。

这个时候需要这样做:

1.安装事件过滤器ui.lineEdit->installEventFilter(this);

2.重写bool eventFilter(QObject *target, QEvent *event);

bool eventFilter(QObject *target, QEvent *event)
{
    if (target == ui.lineEdit && event->type() == QEvent::FocusIn)
    {    
        //设置只能输入数字
        QRegExpValidator *pRevalidotor = new QRegExpValidator(QRegExp("[0-9]{20}"), this);
        ui.lineEdit ->setValidator(pRevalidotor);
        ui.lineEdit ->setAttribute(Qt::WA_InputMethodEnabled, false);
    }
    if (target == ui.lineEdit && event->type() == QEvent::FocusOut)
    {
        if (ui.lineEdit ->validator() != nullptr)
        {
            delete ui.lineEdit ->validator();
            ui.lineEdit ->setValidator(nullptr);
        }  
    }
    return QWidget::eventFilter(target, event);
}
           

大家觉得OK,请点个赞👍👍👍,谢谢。

继续阅读