- 1. Projektstruktur
- 2. mainwindow.ui
- 3. lineEdit.pro
- 4. main.cpp
- 5. mainwindow.h
- 6. mainwindow.cpp
- 7. Ergebnis
Verfügbare ähnliche Artikel in Qt/QML und PyQt5/Python
Wenn Sie Netzwerkanwendungen entwickeln, müssen Sie möglicherweise ein Formular für die Eingabe der IP-Adresse erstellen, aber die Verwendung einer einfachen Methode setInputMask("000.000.000.000;_"); von QLineEdit liefert nicht das richtige Ergebnis da diese Maske die Eingabe der Werte 999, 657 usw. ermöglicht, während die IP-Adresse der begrenzten Anzahl von 255.
Eine Möglichkeit, dieses Problem zu lösen, besteht darin, Validator zu verwenden.
Projektstruktur
Das Projekt wird als Qt Widgets-Anwendung erstellt, in der standardmäßig Dateien erstellt werden:
- QLineEdit_IP_Address.pro - Projektprofil;
- mainwindow.h - Header-Datei des Hauptfensters;
- mainwindow.cpp - Quellcode des Hauptfensters;
- main.cpp - die Hauptquelldatei, von der aus die Anwendung startet;
- mainwindow.ui - Datei der Benutzeroberfläche.
Notiz. Der größte Teil der Benutzeroberfläche wird im Designer erstellt, um die überflüssigen Informationen des Hauptlogikcodes nicht zu überladen..
mainwindow.ui
Formular für QLineBearbeiten
Im Designer muss die Form des Fensters mit der Ansicht wie auf dem Bild erstellt werden.
Das Interesse besteht nur in der Form QLineEdit , die lineEdit heißt.
lineEdit.pro
Diese Datei ist für uns nicht interessiert, da sie standardmäßig erstellt wurde.
#------------------------------------------------- # # 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
Diese Datei interessiert auch nicht, sie wurde standardmäßig erstellt.
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
mainwindow.h
Diese Datei interessiert auch nicht, sie wurde standardmäßig erstellt.
#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 dieser Datei wurden zum Erstellen eines Validators angewendet:
- QRegExp - Klasse von regulären Ausdrücken;
- QRegExpValidator - Klasse des Validators für reguläre Ausdrücke;
#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; }
Ergebnis
QLineEdit mit IP-Adressvalidierung
Nachdem Sie das Projekt erstellt haben, können Sie die Arbeit des Validators mit der IP-Adresseingabe überprüfen.
при сборке ошибка:
Спасибо, первый выполненный урок по вашим статьям!
Вопрос: чем написание регулярного выражения на 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 очень плохо работает с переносами строк.
То есть, например, следующий вариант будет рабочим:
А вот этот вариант уже рабочим не будет:
Обязательно нужно экранировать переносы строк обратным слешем.