Qt/C++ - Урок 001. QLineEdit IP Address

lineedit, ip address, QLineEdit IP Address, qt, ip адрес, QLineEdit example, qtcreator, qlineedit

Доступны аналогичные статьи на Qt/QML и PyQt5/Python

При разработке сетевых приложений может потребоваться создание формочки для ввода ip-адреса, но применение простого метода setInputMask("000.000.000.000;_"); с данным аргументом для QLineEdit не обеспечивает должного результата, поскольку маска позволяет вводить значения 999, 657 и т.д., тогда как IP-адрес ограничивается число 255.

Одним из способов решения данной проблемы является применение Валидатора .

Структура проекта

Проект создается как Приложение Qt Widgets, в котором по умолчанию создаются файлы:

  • lineEdit.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-адреса.

Ссылка на репозиторий с проектом

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
- блог компании
Поддержать автора Donate
НК

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

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

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

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

СС
И может знаете, как использовать пробел в названии программы при сборке в статической версии 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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Ищу работу?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

A
15 октября 2019 г. 6:57
Alexander_65

C++ - Тест 006. Перечисления

  • Результат:60баллов,
  • Очки рейтинга-1
A
15 октября 2019 г. 6:32
Alexander_65

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
A
15 октября 2019 г. 6:26
Alexander_65

C++ - Тест 005. Структуры и Классы

  • Результат:66баллов,
  • Очки рейтинга-1
Последние комментарии
14 октября 2019 г. 7:48
Евгений Легоцкой

Добрый день. Нет, если сами по себе координаты при ресайзе все подсчитываются правильно, то это уже проблема графической подсистемы в ОС и работы с X11, если вы конечно под Linux собирали проект…
m
13 октября 2019 г. 9:17
magrif

Здравствуйте. Сделал подобным образом ресайз и в Qt Widgets, и в QML. Везде получаю, что при изменении размера через левую или верхннюю границы проихсодит мерцание подобно как на этом виде…
6 октября 2019 г. 13:44
Евгений Легоцкой

Может база не открылась в прошлый раз. Либо пересобрали проект. хз, если честно ))
s
6 октября 2019 г. 11:27
sander-007

Добрый день Евгений. Спасибо за пример, все понятно. Попытался сделать по аналогии сохранение в базе MySQL заготовок отчетов excel, но MySQL ругается на нарушение в строке запроса. Я подозреваю,…
30 сентября 2019 г. 3:33
Евгений Легоцкой

Если честно то с авторизацией в мобильном приложении я не работал. Знаю, что для таких вещей используют батарейку Django Rest Framework, с помощью которого можно получить токена для самого сайта…
Сейчас обсуждают на форуме
14 октября 2019 г. 14:51
Евгений Легоцкой

Добрый день. Первое, что приходит на ум, то можно подружить это дело через веб сокеты. Со стороны Django - это использование батарейки django-channels, а со стороны это QtWebSockets. …
11 октября 2019 г. 3:11
Евгений Легоцкой

Понятно. Мне нужен пример вашего кода с проблемой. Если сможете накидать вырезку из вашего проекта, которую можно будет скомпилировать и посмотреть, что там происходит, то попробую помочь. Но бы…
t
10 октября 2019 г. 10:58
tantrido

Вот ответ на мой вопрос: https://doc.qt.io/qt-5/qtvirtualkeyboard-deployment-guide.html#creating-inputpanel The input panel must be a sibling element next to the application conta…
9 октября 2019 г. 15:45
Евгений Легоцкой

Добрый день. Нет, я таким не сталкивался, но вот таким образом вы можете разбить тот тег, на ноды, и забрать текст в нормально порядке, а потом вам уже не составит труда, как я думаю, запи…
9 октября 2019 г. 12:04
Вадим Полшков

Здравствуйте. Все получилось, только редирект сделал по другому redirect(price.file.url) Спасибо вам за помощь!
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB