- 1. Структура проекта
- 2. mainwindow.ui
- 3. lineEdit.pro
- 4. main.cpp
- 5. mainwindow.h
- 6. mainwindow.cpp
- 7. Итог
Доступны аналогичные статьи на 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
Данный файл не представляет интереса и имеет вид по умолчанию.
- #-------------------------------------------------
- #
- # Project created by QtCreator 2015-08-10T14:35:22
- #
- #-------------------------------------------------
- QT += core gui
- greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- TARGET = lineEdit
- TEMPLATE = app
- SOURCES += main.cpp\
- mainwindow.cpp
- HEADERS += mainwindow.h
- FORMS += mainwindow.ui
main.cpp
Также не представляет интереса ввиду вида по умолчанию.
- #include "mainwindow.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- return a.exec();
- }
mainwindow.h
В данный файл также не вносились изменения
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- namespace Ui {
- class MainWindow;
- }
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~MainWindow();
- private:
- Ui::MainWindow *ui;
- };
- #endif // MAINWINDOW_H
mainwindow.cpp
В данном файле для создания Валидатора были применены:
- QRegExp - класс регулярных выражений;
- QRegExpValidator - класс Валидатора регулярных выражений.
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QRegExpValidator>
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- /* Создаем строку для регулярного выражения */
- QString ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])";
- /* Создаем регулярное выражение с применением строки, как
- * повторяющегося элемента
- */
- QRegExp ipRegex ("^" + ipRange
- + "\\." + ipRange
- + "\\." + ipRange
- + "\\." + ipRange + "$");
- /* Создаем Валидатор регулярного выражения с применением
- * созданного регулярного выражения
- */
- QRegExpValidator *ipValidator = new QRegExpValidator(ipRegex, this);
- /* Устанавливаем Валидатор на QLineEdit */
- ui->lineEdit->setValidator(ipValidator);
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
Итог
QLineEdit с валидацией IP адреса
После создания Валидатора запускаем проект и радуемся рабочей проверке на ввод IP-адреса.
при сборке ошибка:
Спасибо, первый выполненный урок по вашим статьям!
Вопрос: чем написание регулярного выражения на Qt/C++ лучше Qt/Qml ?
И второй вопрос: куда копать для создания поля ввода IP-адреса вида » . . . » т.е., чтобы человек видел неудаляемые точки и мог вводить числа только между точек (при этом копирование / вставку чтоб можно было осуществлять сразу всего адреса по подсетям — это работа со строками, как подозреваю)?
не хочет компилится.
В релизной динамической сборке компилится без проблем :)
Насчёт этого момента я без понятия. Не сталкивался с такой проблемой.
Здесь стоит переопределить метод paintEvent(), в котором уже выводить отформатированный вариант. При этом запретить ввод любых других символов, кроме цифр.
Также… возможно придётся переопределить метод KeyPressEvent(), чтобы перехватывать комбинацию Ctrl+C и отдавать уже отформатированный вариант текста.
Так что тут придётся наследоваться от QLineEdit, писать собственную рисовалку текста в методе paint(), и перехватывать работу с комбинация копирования и вставки.
Возможно, есть способ и полегче, но я бы сделал так.
Что касается Qt/C++ против Qt/QML, то на C++ написание регулярок показалось мне более удобным и есть возможность их склеивать и комбинировать. На Qt/QML как-то посложнее будет, особенно если регулярку держать в качестве property. Но думаю, что если вынести её полностью в JavaScript часть QML и работать чисто как с JavaScript, выделяя под неё память не в качестве property, то должно получиться склеивать и комбинировать регулярки. Но я не проверял.
Да, всё верно — в .pro файле прописываю имя программы с пробелом и в кавычках (иначе компилятор ругается) и корректная сборка происходит в динамической версии.
возможно под статику каких-то модулей не хватает?
собирал по статье: Cyberforum
Теоретически, возможно и не хватает модулей, поскольку больше года прошло с момента той статьи.
Но каких именно, я Вам не подскажу.
Единственное, обратите внимание на переносы строк в .pro файле. QMAKE очень плохо работает с переносами строк.
То есть, например, следующий вариант будет рабочим:
А вот этот вариант уже рабочим не будет:
Обязательно нужно экранировать переносы строк обратным слешем.