windows IP Control validation

本文介绍了一个用于输入和验证IPv4地址的自定义Qt控件。该控件由四个部分组成,每个部分负责输入0到255之间的数字,并通过内置验证确保输入的有效性。此外,还实现了键盘事件监听及焦点转移功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//MyIpPartLineEdit.cpp

#include "MyIpPartLineEdit.h"
#include
#include

MyIpPartLineEdit::MyIpPartLineEdit(QWidget *parent/* = 0*/)
: QLineEdit(parent)
{
next_tab_ = NULL;

this->setMaxLength(3);
this->setFrame(false);
this->setAlignment(Qt::AlignCenter);

QValidator *validator = new QIntValidator(0, 255, this);
this->setValidator(validator);

connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(text_edited(const QString&)));
}

MyIpPartLineEdit::~MyIpPartLineEdit(void)
{
}

void MyIpPartLineEdit::focusInEvent(QFocusEvent *e)
{
this->selectAll();
QLineEdit::focusInEvent(e);
}

void MyIpPartLineEdit::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Period)
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
QLineEdit::keyPressEvent(event);
}

void MyIpPartLineEdit::text_edited(const QString& text)
{
QIntValidator v(0, 255, this);
QString ipaddr = text;
int pos = 0;
QValidator::State state = v.validate(ipaddr, pos);
if (state == QValidator::Acceptable)
{
if (ipaddr.size() > 1)
{
if (ipaddr.size() == 2)
{
int ipnum = ipaddr.toInt();

if (ipnum > 25)
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
}
else
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
}
}
}

/////////////////////////////////////////////////////////////////////////////////
//MyIpPartLineEdit.h

#ifndef MYIPPARTLINEEDIT_H
#define MYIPPARTLINEEDIT_H
// MyIpPartLineEdit.h
#pragma once

#include

class QWidget;
class QFocusEvent;
class QKeyEvent;

class MyIpPartLineEdit : public QLineEdit
{
Q_OBJECT
public:
MyIpPartLineEdit(QWidget *parent = 0);
~MyIpPartLineEdit(void);

void set_nexttab_edit(QLineEdit *nexttab) { next_tab_ = nexttab; }

protected:
virtual void focusInEvent(QFocusEvent *e);
virtual void keyPressEvent(QKeyEvent *event);

private slots:
void text_edited(const QString& text);

private:
QLineEdit *next_tab_;
};
#endif // MYIPPARTLINEEDIT_H
///////////////////////////////////////////////////////////////////////////////
//MyIpAddrEdit.cpp

#include "MyIpAddrEdit.h"
#include
#include
#include "MyIpPartLineEdit.h"

MyIpAddrEdit::MyIpAddrEdit(QWidget* pParent /* = 0 */)
: QWidget(pParent)
{
ip_part1_ = new MyIpPartLineEdit(this);
ip_part2_ = new MyIpPartLineEdit(this);
ip_part3_ = new MyIpPartLineEdit(this);
ip_part4_ = new MyIpPartLineEdit(this);

labeldot1_ = new QLabel(this);
labeldot2_ = new QLabel(this);
labeldot3_ = new QLabel(this);

ip_part1_->setGeometry(QRect(0, 0, 30, 20));
ip_part2_->setGeometry(QRect(30, 0, 30, 20));
ip_part3_->setGeometry(QRect(60, 0, 30, 20));
ip_part4_->setGeometry(QRect(90, 0, 30, 20));

labeldot1_->setText(" .");
labeldot1_->setGeometry(QRect(27, 1, 6, 18));
labeldot1_->setAlignment(Qt::AlignCenter);

labeldot2_->setText(" .");
labeldot2_->setGeometry(QRect(57, 1, 6, 18));
labeldot2_->setAlignment(Qt::AlignCenter);

labeldot3_->setText(" .");
labeldot3_->setGeometry(QRect(87, 1, 6, 18));
labeldot3_->setAlignment(Qt::AlignCenter);

QWidget::setTabOrder(ip_part1_, ip_part2_);
QWidget::setTabOrder(ip_part2_, ip_part3_);
QWidget::setTabOrder(ip_part3_, ip_part4_);
ip_part1_->set_nexttab_edit(ip_part2_);
ip_part2_->set_nexttab_edit(ip_part3_);
ip_part3_->set_nexttab_edit(ip_part4_);

connect(ip_part1_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part2_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part3_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part4_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));

connect(ip_part1_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part2_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part3_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part4_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));

}

MyIpAddrEdit::~MyIpAddrEdit()
{

}

void MyIpAddrEdit::textchangedslot(const QString& /*text*/)
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();

QString ipaddr = QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);

emit textchanged(ipaddr);
}

void MyIpAddrEdit::texteditedslot(const QString &/*text*/)
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();

QString ipaddr = QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);

emit textedited(ipaddr);
}

void MyIpAddrEdit::settext(const QString &text)
{
QString ippart1, ippart2, ippart3, ippart4;
QString qstring_validate = text;

// IP地址验证
QRegExp regexp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
QRegExpValidator regexp_validator(regexp, this);
int nPos = 0;
QValidator::State state = regexp_validator.validate(qstring_validate, nPos);
// IP合法
if (state == QValidator::Acceptable)
{
QStringList ippartlist = text.split(".");

int strcount = ippartlist.size();
int index = 0;
if (index < strcount)
{
ippart1 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart2 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart3 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart4 = ippartlist.at(index);
}
}

ip_part1_->setText(ippart1);
ip_part2_->setText(ippart2);
ip_part3_->setText(ippart3);
ip_part4_->setText(ippart4);
}

QString MyIpAddrEdit::text()
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();

return QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);
}

void MyIpAddrEdit::setStyleSheet(const QString &styleSheet)
{
ip_part1_->setStyleSheet(styleSheet);
ip_part2_->setStyleSheet(styleSheet);
ip_part3_->setStyleSheet(styleSheet);
ip_part4_->setStyleSheet(styleSheet);
}

///////////////////////////////////////////////////////////////////////////////////
//MyIpAddrEdit.h

#ifndef MYIPADDREDIT_H
#define MYIPADDREDIT_H
#pragma once

#include

class QLineEdit;
class QLabel;
class MyIpPartLineEdit;

class MyIpAddrEdit : public QWidget
{
Q_OBJECT
public:
MyIpAddrEdit(QWidget* pParent = 0);
~MyIpAddrEdit();

void settext(const QString &text);
QString text();
void setStyleSheet(const QString &styleSheet);

signals:
void textchanged(const QString& text);
void textedited(const QString &text);

private slots:
void textchangedslot(const QString& text);
void texteditedslot(const QString &text);

private:
MyIpPartLineEdit *ip_part1_;
MyIpPartLineEdit *ip_part2_;
MyIpPartLineEdit *ip_part3_;
QLineEdit *ip_part4_;

QLabel *labeldot1_;
QLabel *labeldot2_;
QLabel *labeldot3_;
};
#endif // MYIPADDREDIT_H
//////////////////////////////////////////////////////////////////////////////
//main.cpp

#include
#include
#include "MyIpAddrEdit.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QDialog *my_dialog = new QDialog;
MyIpAddrEdit *ipAddr = new MyIpAddrEdit(my_dialog);
ipAddr->settext("127.0.0.1");
my_dialog->show();

return app.exec();
}
/////////////////////////////////////////////////////////////

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值