Evgenij LegotskojAug. 10, 2015, midnight

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
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
V
  • Viktor
  • April 14, 2021, 4:40 p.m.

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

  • Result:50points,
  • Rating points-4
F
  • Fedya
  • April 14, 2021, 5:04 a.m.

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

  • Result:66points,
  • Rating points-1
KP

C++ - Тест 003. Условия и циклы

  • Result:71points,
  • Rating points1
Last comments
YA

PyQt5 - Tutorial 009. Using QThread with MoveToThread

Hello. Let's say I want to send some variables to "run" define. How can we do that? I modified your code, I tried something like below, but the GUI is frozen that way. I could not be able to und…
R

Распознавание изображений на Python с помощью TensorFlow и Keras

почему то вместо 50000 обрабатывает по 782 картинки кажду. эпоху
R
AB

Qt/C++ - Lesson 008. QDataWidgetMapper - Working with the database via a widget

Понял сам так - происходит через setTable() "Sets the database table on which the model operates to tableName. Does not select data from the table, but fetches its field information", а затем че…
AB

Qt/C++ - Lesson 008. QDataWidgetMapper - Working with the database via a widget

Начал делать что-то похожее, но без sql. Не очень понимаю, что делает mapper->setCurrentModelIndex(model->index(row,0)); Вернее не понимаю вот что: откуда он берёт данные, кот…
Now discuss on the forum
VB

Помогите переложить код QML OpenCV c PyQt5 на PySide2

Структура проекта ├── main.py ├── main.qml └── PyCVQML ................├── cvcapture.py ................├── cvitem.py ................└── init .py …

QScrollArea dynamically add QCheckBoxes

Всё правильно. Это просто спамер, который отправился в вечный бан.
d

Подключение приложения qt qml к БД postgresql из приложения qt qml c++, собранное под android

Алексей, код уже написан. Приложение работает под ОС Windows, но хочется его запустить на Android. По поводу сборки драйвера, не получается найти свежей инструкции, а главное рабочей.
d

Qt, Sqlite и Android. Как подключить базу данных?

Добрый день, добавил базу к ресурсам, приложение вроде как открывает БД, но данные не видет, что может быть не так? qt qml c++ под android m_db = QSqlDatabase::addDatabase("QSQLITE")…
  • BlinCT
  • April 13, 2021, 5:11 a.m.

Отображение талицы в Column в qml обьекте

Проблема в том что я все таблицы перевел на вторые контролы, все таблицы на них сделаны, шаблон для них всех создан. Только под 2 эти таблицы возвпащать все на первые контролы не думаю что прави…
About
Services
© EVILEG 2015-2021
Recommend hosting TIMEWEB