Evgenii Legotckoi
Evgenii Legotckoi10 августа 2015 г. 0:00

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

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

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

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

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

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

  • QLineEdit_IP_Address.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"

#include <QRegExpValidator>

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 хостинг.

Вам это нравится? Поделитесь в социальных сетях!

НК
  • 2 июля 2016 г. 15:46

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

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

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

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

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

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

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

СС
  • 22 декабря 2016 г. 18:10
Благодарю, буду пробовать пока отображение точек))
СС
  • 22 декабря 2016 г. 18:13

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

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

Evgenii Legotckoi
  • 22 декабря 2016 г. 23:49

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

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

SOURCES += main.cpp\
        mainwindow.cpp

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

SOURCES += main.cpp
        mainwindow.cpp

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 8:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 8:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 19:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 21:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 15:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 14:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 18:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
Evgenii Legotckoi
Evgenii Legotckoi24 июня 2024 г. 22:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 14:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 10:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 октября 2024 г. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Следите за нами в социальных сетях