IT Notes

QValidator: Пример использования

Если в Qt-приложении требуется обеспечить контроль вводимых пользователем данных, то вы можете ограничить варианты выбора с помощью чек-боксов, радио-кнопок, комбо-боксов, выпадающих списков или схожих виджетов. Но если возникла необходимость предусмотреть большую свободу выбора, то задумайтесь об использовании валидатора QValidator.

QIntValidator, QDoubleValidator и QRegExpValidator

Если ввод пользователя должен быть ограничен целыми числами или числами с плавающей запятой, то вам может подойти один из стандартных валидаторов: QIntValidator и QDoubleValidator соответственно. Для проведения более общих проверок попробуйте QRegExpValidator, основанный на регулярных выражениях. Рассмотрим пример их использования (файл main.cpp):

#include <QApplication>

#include <QLineEdit>
#include <QValidator>
#include <QLayout>
#include <QPushButton>
#include <QDebug>

class ValidatorDemoWidget: public QWidget {
    Q_OBJECT
public:
    ValidatorDemoWidget( QWidget* parent = 0 ) : QWidget( parent ) {
        QVBoxLayout* layout = new QVBoxLayout;

        QLineEdit* intEdit = new QLineEdit;
        edits << intEdit;
        // Валидатор целых чисел от 1000 до 3000
        intEdit->setValidator( new QIntValidator( 1000, 3000 ) );
        layout->addWidget( intEdit );

        QLineEdit* doubleEdit = new QLineEdit;
        edits << doubleEdit;
        // Валидатор чисел с плавающей запятой от 5 до 15 с 2 знаками после запятой
        QDoubleValidator* validator =  new QDoubleValidator( 5.0, 25.0, 2 );
        validator->setNotation( QDoubleValidator::StandardNotation );
        doubleEdit->setValidator( validator );
        layout->addWidget( doubleEdit );

        QLineEdit* reEdit = new QLineEdit;
        edits << reEdit;
        // Валидатор по регулярному выражению для слов, начинающихся с заглавной буквы
        // длинной от 2 до 10 символов латинского алфавита
        reEdit->setValidator( new QRegExpValidator( QRegExp( "[A-Z][a-z]{1,9}" ) ) );
        layout->addWidget( reEdit );

        QPushButton* btn = new QPushButton( trUtf8( "Print" ) );
        connect( btn, SIGNAL( clicked() ), SLOT( onPrint() ) );
        layout->addWidget( btn );

        setLayout( layout );
    }

private slots:
    void onPrint() {
        foreach( QLineEdit* e, edits ) {
            if( e->hasAcceptableInput() ) {
                // Если условие валидатора выполнено
                qDebug() << e->text();
            } else {
                // Если условие валидатора нарушено
                qDebug() << "Invalid";
            }
        }
    }

private:
    QVector< QLineEdit* > edits;
};

int main( int argc, char* argv[] ) {
    QApplication a( argc, argv );

    ValidatorDemoWidget wgt;
    wgt.show();

    return a.exec();
}

#include "main.moc"

После сборки и запуска приложения имеем:

qvalidator-acceptable-demo

В результате нажатия на кнопке Print вызывается слот onPrint(), в котором на консоль выводится:

"2000" 
"10.05" 
"Hello"

Обратите внимание, что корректность содержимого поля ввода перед выводом на консоль проверяется еще раз с помощью hasAcceptableInput(). Такое поведение объясняется тем, что пользователь вводит символы последовательно, а не за один раз. Если бы проверки на соответствие ограничениям были жесткими, то ввести не удалось бы вообще ничего. Поэтому частично соответствующее содержимое ввести можно, но оно не будет допустимым:

qvalidator-invalid-demo

Вывод на консоль после нажатия на кнопку Print:

Invalid 
Invalid 
Invalid

В этом случае поля ввода с некорректным содержимым можно выделять красным цветом или отображать рядом с ними иконки с уведомлениями об ошибке.

Следует заметить, что для контроля ввода чисел более естественным вариантом представляется использование спин-боксов QSpinBox и QDoubleSpinBox. Однако все зависит от ваших задач.

Для большинства приложений вполне достаточно тех стандартных валидаторов, которые мы рассмотрели. Если же процедура проверки ввода достаточно сложная, то вы можете реализовать свой валидатор, наследующий абстрактный класс QValidator. Например, он может осуществлять проверку вводимых данных на основе запросов к базе данных или сведений из сети.

Понравилась статья?
Не забудь поделиться ей с друзьями!
Реклама

Похожие публикации

Комментарии

RSS RSS-рассылка

Популярное