- 1. Жоба құрылымы
- 2. mainwindow.ui
- 3. lineEdit.pro
- 4. main.cpp
- 5. mainwindow.h
- 6. mainwindow.cpp
- 7. Барлығы
Ұқсас мақалалар 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 мекенжайын енгізуді тексеруден ләззат аламыз.
при сборке ошибка:
Спасибо, первый выполненный урок по вашим статьям!
Вопрос: чем написание регулярного выражения на Qt/C++ лучше Qt/Qml ?
И второй вопрос: куда копать для создания поля ввода IP-адреса вида » . . . » т.е., чтобы человек видел неудаляемые точки и мог вводить числа только между точек (при этом копирование / вставку чтоб можно было осуществлять сразу всего адреса по подсетям — это работа со строками, как подозреваю)?
не хочет компилится.
В релизной динамической сборке компилится без проблем :)
Насчёт этого момента я без понятия. Не сталкивался с такой проблемой.
Здесь стоит переопределить метод paintEvent(), в котором уже выводить отформатированный вариант. При этом запретить ввод любых других символов, кроме цифр.
Также… возможно придётся переопределить метод KeyPressEvent(), чтобы перехватывать комбинацию Ctrl+C и отдавать уже отформатированный вариант текста.
Так что тут придётся наследоваться от QLineEdit, писать собственную рисовалку текста в методе paint(), и перехватывать работу с комбинация копирования и вставки.
Возможно, есть способ и полегче, но я бы сделал так.
Что касается Qt/C++ против Qt/QML, то на C++ написание регулярок показалось мне более удобным и есть возможность их склеивать и комбинировать. На Qt/QML как-то посложнее будет, особенно если регулярку держать в качестве property. Но думаю, что если вынести её полностью в JavaScript часть QML и работать чисто как с JavaScript, выделяя под неё память не в качестве property, то должно получиться склеивать и комбинировать регулярки. Но я не проверял.
Да, всё верно — в .pro файле прописываю имя программы с пробелом и в кавычках (иначе компилятор ругается) и корректная сборка происходит в динамической версии.
возможно под статику каких-то модулей не хватает?
собирал по статье: Cyberforum
Теоретически, возможно и не хватает модулей, поскольку больше года прошло с момента той статьи.
Но каких именно, я Вам не подскажу.
Единственное, обратите внимание на переносы строк в .pro файле. QMAKE очень плохо работает с переносами строк.
То есть, например, следующий вариант будет рабочим:
А вот этот вариант уже рабочим не будет:
Обязательно нужно экранировать переносы строк обратным слешем.