Evgenii Legotckoi
10 августа 2015 г. 10:00

Qt/C++ - Урок 001. QLineEdit IP Address

Доступны аналогичные статьи на Qt/QML и PyQt5/Python

При разработке сетевых приложений может потребоваться создание формочки для ввода ip-адреса, но применение простого метода setInputMask("000.000.000.000;_"); с данным аргументом для QLineEdit не обеспечивает должного результата, поскольку маска позволяет вводить значения 999, 657 и т.д., тогда как IP-адрес ограничивается число 255.

Одним из способов решения данной проблемы является применение Валидатора .

Структура проекта

Проект создается как Приложение Qt Widgets, в котором по умолчанию создаются файлы:

  • QLineEdit_IP_Address.pro - профайл проекта;
  • mainwindow.h - заголовочный файл главного окна;
  • mainwindow.cpp - исходный код окна;
  • main.cpp - основной исходный файл, с которого стартует приложение;
  • mainwindow.ui - файлы формы главного окна.

Примечание. Большую часть интерфейса создаю в дизайнере, чтобы не загромождать логику основного кода лишней информацией. По сути это лишь дело вкуса и привычки.

mainwindow.ui

Формочка окна для QLineEdit

В дизайнере накидываем формочку, чтобы она выглядела следующим образом.

Интерес представляет в этой формочке только лишь QLineEdit , который назван просто lineEdit .

lineEdit.pro

Данный файл не представляет интереса и имеет вид по умолчанию.

  1. #-------------------------------------------------
  2. #
  3. # Project created by QtCreator 2015-08-10T14:35:22
  4. #
  5. #-------------------------------------------------
  6.  
  7. QT += core gui
  8.  
  9. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  10.  
  11. TARGET = lineEdit
  12. TEMPLATE = app
  13.  
  14.  
  15. SOURCES += main.cpp\
  16. mainwindow.cpp
  17.  
  18. HEADERS += mainwindow.h
  19.  
  20. FORMS += mainwindow.ui

main.cpp

Также не представляет интереса ввиду вида по умолчанию.

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. MainWindow w;
  8. w.show();
  9.  
  10. return a.exec();
  11. }

mainwindow.h

В данный файл также не вносились изменения

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QMainWindow>
  5.  
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9.  
  10. class MainWindow : public QMainWindow
  11. {
  12. Q_OBJECT
  13.  
  14. public:
  15. explicit MainWindow(QWidget *parent = 0);
  16. ~MainWindow();
  17.  
  18. private:
  19. Ui::MainWindow *ui;
  20. };
  21.  
  22. #endif // MAINWINDOW_H

mainwindow.cpp

В данном файле для создания Валидатора были применены:

  • QRegExp - класс регулярных выражений;
  • QRegExpValidator - класс Валидатора регулярных выражений.
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. #include <QRegExpValidator>
  5.  
  6. MainWindow::MainWindow(QWidget *parent) :
  7. QMainWindow(parent),
  8. ui(new Ui::MainWindow)
  9. {
  10. ui->setupUi(this);
  11.  
  12. /* Создаем строку для регулярного выражения */
  13. QString ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])";
  14. /* Создаем регулярное выражение с применением строки, как
  15. * повторяющегося элемента
  16. */
  17. QRegExp ipRegex ("^" + ipRange
  18. + "\\." + ipRange
  19. + "\\." + ipRange
  20. + "\\." + ipRange + "$");
  21. /* Создаем Валидатор регулярного выражения с применением
  22. * созданного регулярного выражения
  23. */
  24. QRegExpValidator *ipValidator = new QRegExpValidator(ipRegex, this);
  25. /* Устанавливаем Валидатор на QLineEdit */
  26. ui->lineEdit->setValidator(ipValidator);
  27. }
  28.  
  29. MainWindow::~MainWindow()
  30. {
  31. delete ui;
  32. }

Итог

QLineEdit с валидацией IP адреса

После создания Валидатора запускаем проект и радуемся рабочей проверке на ввод IP-адреса.

Вам это нравится? Поделитесь в социальных сетях!

НК
  • 3 июля 2016 г. 1:46

при сборке ошибка: 

/home/user/untitled1/mainwindow.cpp:24: ошибка: class Ui::MainWindow has no member named lineEdit
ui->lineEdit->setValidator(ipValidator);
^
НК
  • 3 июля 2016 г. 1:50
Из-за глупости не добавил объект lineEdit. прошу прощения
Бывает ))
СС
  • 20 декабря 2016 г. 6:42

Спасибо, первый выполненный урок по вашим статьям!

Вопрос: чем написание регулярного выражения на Qt/C++ лучше Qt/Qml ?
И второй вопрос: куда копать для создания поля ввода IP-адреса вида » . . . » т.е., чтобы человек видел неудаляемые точки и мог вводить числа только между точек (при этом копирование / вставку чтоб можно было осуществлять сразу всего адреса по подсетям — это работа со строками, как подозреваю)?

СС
  • 20 декабря 2016 г. 7:19
И может знаете, как использовать пробел в названии программы при сборке в статической версии Qt?
не хочет компилится.
В релизной динамической сборке компилится без проблем :)
Evgenii Legotckoi
  • 20 декабря 2016 г. 11:31
Пробел в названии программы… Вы имеете ввиду название, которое прописывается в PRO файле?
Насчёт этого момента я без понятия. Не сталкивался с такой проблемой.
Evgenii Legotckoi
  • 20 декабря 2016 г. 11:40

Здесь стоит переопределить метод paintEvent(), в котором уже выводить отформатированный вариант. При этом запретить ввод любых других символов, кроме цифр.
Также… возможно придётся переопределить метод KeyPressEvent(), чтобы перехватывать комбинацию Ctrl+C и отдавать уже отформатированный вариант текста.
Так что тут придётся наследоваться от QLineEdit, писать собственную рисовалку текста в методе paint(), и перехватывать работу с комбинация копирования и вставки.
Возможно, есть способ и полегче, но я бы сделал так.

Что касается Qt/C++ против Qt/QML, то на C++ написание регулярок показалось мне более удобным и есть возможность их склеивать и комбинировать. На Qt/QML как-то посложнее будет, особенно если регулярку держать в качестве property. Но думаю, что если вынести её полностью в JavaScript часть QML и работать чисто как с JavaScript, выделяя под неё память не в качестве property, то должно получиться склеивать и комбинировать регулярки. Но я не проверял.

СС
  • 23 декабря 2016 г. 5:10
Благодарю, буду пробовать пока отображение точек))
СС
  • 23 декабря 2016 г. 5:13

Да, всё верно — в .pro файле прописываю имя программы с пробелом и в кавычках (иначе компилятор ругается) и корректная сборка происходит в динамической версии.

возможно под статику каких-то модулей не хватает?
собирал по статье: Cyberforum

Evgenii Legotckoi
  • 23 декабря 2016 г. 10:49

Теоретически, возможно и не хватает модулей, поскольку больше года прошло с момента той статьи.
Но каких именно, я Вам не подскажу.
Единственное, обратите внимание на переносы строк в .pro файле. QMAKE очень плохо работает с переносами строк.

То есть, например, следующий вариант будет рабочим:

SOURCES += main.cpp\
        mainwindow.cpp

А вот этот вариант уже рабочим не будет:

SOURCES += main.cpp
        mainwindow.cpp

Обязательно нужно экранировать переносы строк обратным слешем.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь