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