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

Content

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.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
- company blog
Support the author Donate
NK

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

/home/user/untitled1/mainwindow.cpp:24: ошибка: ‘class Ui::MainWindow’ has no member named ‘lineEdit’
ui->lineEdit->setValidator(ipValidator);
^
NK
Из-за глупости не добавил объект lineEdit. прошу прощения
Бывает ))
SS

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

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

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

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

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

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

Да, всё верно — в .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
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
AS
May 26, 2020, 12:29 p.m.
Artem Sun-Dun-Chan

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
MN
May 25, 2020, 12:33 p.m.
Mitja Nagibin

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
f
May 25, 2020, 6:05 a.m.
falcon

C++ - Test 001. The first program and data types

  • Result:66points,
  • Rating points-1
Last comments
May 28, 2020, 4:14 p.m.
Evgenij Legotskoj

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

Ну в моём примере, который в статье сработало так model->setData(model->index(1, 1), 7); Поскольку model->index(1, 0) - это индекс колонки id, которая скрыта, поэтому…
MA
May 28, 2020, 4:08 p.m.
Mihail A

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

Спасибо, завтра првоерю. А model->setData(model->index(1, 0), 7); Тоже заработало?
May 28, 2020, 4:06 p.m.
Evgenij Legotskoj

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

Да, метод data всё-таки влиял, я переписал его так и заработало удаление QVariant TableModel::data(const QModelIndex &idx, int role) const{ if (role == Qt::BackgroundColorRole) {…
May 28, 2020, 3:49 p.m.
Evgenij Legotskoj

Django - Tutorial 011. Adding comments to the site based on Django

Он более функциональный и его функционал объективно лучше поддерживается Django. Из первого, что приходит на ум: Это наличие полей типа Array Поддержка полей для JSON …
May 28, 2020, 3:42 p.m.
progammist

Django - Tutorial 011. Adding comments to the site based on Django

а в чем явное преимущество postgresql над mysql?)
Now discuss on the forum
RG
May 28, 2020, 7:21 p.m.
Rovshan Gurbanov

Сборка под старые версии Android

У меня SDK почти все версии есть, NDK есть версии 10, 17, 21. Но собирается приложение только с NDK v21 под Android версии 7.0 и выше Версия Qt у меня 5.14.2
May 28, 2020, 8:58 a.m.
Evgenij Legotskoj

Освобождение памяти QMainWindow::setCentralWidget

Да, соглашусь. Просто удаление происходит позже, а не сразу.
May 28, 2020, 6:43 a.m.
Mihailll

При подключении к git как указать пароль?

Нужно сделать ssh-keygen и потом полученый из файла код скопировать в ssh ключ в бикбакете
F
May 28, 2020, 2:42 a.m.
Fidan

QML

Да, проблема ушла, спасибо.
May 1, 2020, 9:19 a.m.
Mihailll

Как в Qt в qmenu добавить scrollarea

Вот это наследованный класс меню. Но посути это обычное меню. #pragma once#include <QtWidgets>class TransMenu : public QMenu { Q_OBJECTpublic: TransMenu(QWidget* parent = …
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB