- 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 очень плохо работает с переносами строк.
То есть, например, следующий вариант будет рабочим:
А вот этот вариант уже рабочим не будет:
Обязательно нужно экранировать переносы строк обратным слешем.