Evgenii Legotckoi
Aug. 10, 2015, 10 a.m.

Qt/C++ - Lesson 001. QLineEdit IP Address

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.

  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

This file is not interested also, it was created by default.

  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

This file is not interested also, it was created by default.

  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

In this file to create a Validator have been applied:

  • QRegExp - class of regular expressions;
  • QRegExpValidator - class of Validator for regular expression;
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9.  
  10. /* Create a string for a regular expression */
  11. QString ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])";
  12. /* Create a regular expression with a string
  13. * as a repeating element
  14. */
  15. QRegExp ipRegex ("^" + ipRange
  16. + "\\." + ipRange
  17. + "\\." + ipRange
  18. + "\\." + ipRange + "$");
  19. /* Create a validation regular expression
  20. * using a regular expression
  21. */
  22. QRegExpValidator *ipValidator = new QRegExpValidator(ipRegex, this);
  23. /* Set Validator on QLineEdit */
  24. ui->lineEdit->setValidator(ipValidator);
  25. }
  26.  
  27. MainWindow::~MainWindow()
  28. {
  29. delete ui;
  30. }

Result

QLineEdit with ip-address validation

After creating the project you can check the work of Validator with IP-address input.

Do you like it? Share on social networks!

НК
  • July 3, 2016, 1:46 a.m.

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

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

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

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

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

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

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

Благодарю, буду пробовать пока отображение точек))

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

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

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

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

SOURCES += main.cpp\
        mainwindow.cpp

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

SOURCES += main.cpp
        mainwindow.cpp

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
  • A
    Oct. 19, 2024, 5:19 p.m.
    Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html