Evgenii Legotckoi
Evgenii LegotckoiТам. 10, 2015, түнжарым

Qt/C++ - Урок 001. QLineEdit IP мекенжайы

Ұқсас мақалалар Qt/QML және PyQt5/Python мекенжайларында қолжетімді.

Желілік қолданбаларды әзірлеу кезінде IP мекенжайын енгізуге арналған пішінді жасау қажет болуы мүмкін, бірақ қарапайым әдісті қолдану арқылы setInputMask("000.000.000.000;_"); QLineEdit үшін осы аргументпен қалағанды қамтамасыз етпейді. нәтиже, өйткені маска 999 , 657 және т.б. мәндерін енгізуге мүмкіндік береді, ал IP мекенжайы 255 санымен шектелген.

Бұл мәселені шешудің бір жолы Validator пайдалану болып табылады.

Жоба құрылымы

Жоба әдепкі бойынша файлдарды жасайтын Qt Widgets қолданбасы ретінде жасалған:

  • QLineEdit_IP_Address.pro - жоба профилі;
  • mainwindow.h – негізгі терезе тақырыбының файлы;
  • mainwindow.cpp – терезенің бастапқы коды;
  • main.cpp – қолданба басталатын негізгі бастапқы файл;
  • mainwindow.ui – негізгі терезе пішінінің файлдары.

Ескерту. Мен негізгі кодтың логикасын қажетсіз ақпаратпен шатастырмау үшін дизайнерде интерфейстің көп бөлігін жасаймын. Шындығында, бұл тек дәм мен әдетке байланысты мәселе .

mainwindow.ui

QLineEdit үшін терезе пішіні

Дизайнерде біз пішінді осылай көрінетін етіп лақтырамыз.

Бұл пішін тек lineEdit деп аталатын QLineEdit қызықтырады.

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;
}

Барлығы

IP мекенжайын тексеру арқылы QLineEdit

Валидаторды жасағаннан кейін біз жобаны іске қосамыз және IP мекенжайын енгізуді тексеруден ләззат аламыз.

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

НК
  • Шілде 2, 2016, 3:46 Т.Қ.

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

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

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

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

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

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

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

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

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

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

Evgenii Legotckoi
  • Жел. 22, 2016, 11:49 Т.Қ.

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

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

SOURCES += main.cpp\
        mainwindow.cpp

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

SOURCES += main.cpp
        mainwindow.cpp

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
m
  • molni99
  • Қаз. 26, 2024, 8:37 Т.Ж.

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

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 8:29 Т.Ж.

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

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10

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

  • Нәтиже:42ұпай,
  • Бағалау ұпайлары-8
Соңғы пікірлер
i
innorwallҚар. 8, 2024, 10:45 Т.Ж.
QML - Урок 002. QML Android жүйесіндегі пайдаланушы түймесі 2007; 14 2 270 83 priligy dapoxetine 60mg Testicular imaging is sort of a unique niche right now, Гў
i
innorwallҚар. 8, 2024, 9:32 Т.Ж.
C++ - #pragma бір рет құрастыруды жылдамдатады ма? It could cause harm to the unborn baby buy generic priligy
i
innorwallҚар. 8, 2024, 8:50 Т.Ж.
ЖАМАНДЫҚ ЯРЕК. Google reCAPTCHA пайдалану buy priligy 60 urea in 50 patients treated by urea for mild hyponatremia developed it in the intensive care unit mean age 71 20 years
Енді форумда талқылаңыз
i
innorwallҚар. 8, 2024, 8:48 Т.Ж.
добавить qlineseries в функции Uncommon but potentially severe adverse events include profound electrolyte and water loss, dehydration leading to hypotension and syncope, electrolyte depletion with hypokalemia, hypomagnesemia…
9
9AnonimҚаз. 25, 2024, 4:10 Т.Қ.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
F
FynjyШілде 22, 2024, 11:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Бізді әлеуметтік желілерде бақылаңыз