- 1. Project structure
- 2. mainwindow.ui
- 3. lineEdit.pro
- 4. main.cpp
- 5. mainwindow.h
- 6. mainwindow.cpp
- 7. Result
Available similar articles in Qt/QML and PyQt5/Python
When you will develop network applications, you may need to create form for input ip-address, but the use of a simple method setInputMask("000.000.000.000;_"); of QLineEdit does not provide the proper result as this mask allows to enter the values of 999, 657, etc., while the IP-address of the limited number of 255.
One way to solve this problem is to use Validator .
Project structure
The project is created as an application Qt Widgets, where files are created by default:
- QLineEdit_IP_Address.pro - project profile;
- mainwindow.h - header file of main window;
- mainwindow.cpp - source code of main window;
- main.cpp - the main source file from which the application starts;
- mainwindow.ui - file of user interface.
Note. Most of the interface is created in the designer, so as not to clutter up the main logic code superfluous information..
mainwindow.ui
Form for QLineEdit
In the designer need to create form of window with view as on the picture.
The interest is in the form only QLineEdit , which is named lineEdit .
lineEdit.pro
This file is not interested for us, because it was created by default.
#------------------------------------------------- # # 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
This file is not interested also, it was created by default.
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
mainwindow.h
This file is not interested also, it was created by default.
#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
In this file to create a Validator have been applied:
- QRegExp - class of regular expressions;
- QRegExpValidator - class of Validator for regular expression;
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); /* Create a string for a regular expression */ QString ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"; /* Create a regular expression with a string * as a repeating element */ QRegExp ipRegex ("^" + ipRange + "\\." + ipRange + "\\." + ipRange + "\\." + ipRange + "$"); /* Create a validation regular expression * using a regular expression */ QRegExpValidator *ipValidator = new QRegExpValidator(ipRegex, this); /* Set Validator on QLineEdit */ ui->lineEdit->setValidator(ipValidator); } MainWindow::~MainWindow() { delete ui; }
Result
QLineEdit with ip-address validation
After creating the project you can check the work of Validator with IP-address input.
при сборке ошибка:
Спасибо, первый выполненный урок по вашим статьям!
Вопрос: чем написание регулярного выражения на 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 очень плохо работает с переносами строк.
То есть, например, следующий вариант будет рабочим:
А вот этот вариант уже рабочим не будет:
Обязательно нужно экранировать переносы строк обратным слешем.