QLineEdit IP地址校验
原文出处:【上善若静水】
1.通过自定义类方式实现IP4地址范围限制输入:
//--------------------TLineEditIP.h--------------------
#ifndef TLINEEDITIP_H
#define TLINEEDITIP_H #include <QLineEdit>
#include <QEvent> class TLineEditIP : public QLineEdit
{
Q_OBJECT #define QTUTL_IP_SIZE 4 signals :
void signalTextChanged(QLineEdit* pEdit); public:
TLineEditIP(QWidget *parent = );
~TLineEditIP(); void setText(const QString &strIP);
QString text() const; public slots:
void slotTextChanged(QLineEdit* pEdit); protected:
void paintEvent(QPaintEvent *event);
bool eventFilter(QObject *obj, QEvent *ev); int getIndex(QLineEdit *pEdit);
bool isTextValid(const QString &strIP); private:
static QString getIPItemStr(unsigned char item); private:
QLineEdit *m_lineEidt[];
}; #endif // TLINEEDITIP_H
//--------------------TLineEditIP.cpp--------------------
#include "TLineEditIP.h"
#include <QRegExpValidator>
#include <QPainter>
#include <QHBoxLayout>
#include <QKeyEvent>
#include <QMessageBox>
#include <QDebug> TLineEditIP::TLineEditIP(QWidget *parent)
:QLineEdit(parent)
{
QRegExp rx("(2[0-5]{2}|2[0-4][0-9]|1?[0-9]{1,2})");
QHBoxLayout *pHBox = new QHBoxLayout(this);
pHBox->setSpacing();
pHBox->setContentsMargins(,,,);
for (int i = ; i < ; i++)
{
m_lineEidt[i] = new QLineEdit(this);
m_lineEidt[i]->setFrame(false);
m_lineEidt[i]->setMaxLength();
m_lineEidt[i]->setTextMargins(,,,);
m_lineEidt[i]->setAlignment(Qt::AlignCenter);
m_lineEidt[i]->installEventFilter(this);
m_lineEidt[i]->setValidator(new QRegExpValidator(rx, this));
m_lineEidt[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
m_lineEidt[i]->setStyleSheet("QLineEdit{font: 12px \"Microsoft YaHei\";color:rgb(119,119,119);background-color:rgb(255,255,255);border:none;}");
m_lineEidt[i]->setAttribute(Qt::WA_MacShowFocusRect, );
m_lineEidt[i]->setContextMenuPolicy(Qt::NoContextMenu);
pHBox->addWidget(m_lineEidt[i]);
}
this->setReadOnly(true);
this->setContextMenuPolicy(Qt::NoContextMenu);
installEventFilter(this);
connect(this, SIGNAL(signalTextChanged(QLineEdit*)),
this, SLOT(slotTextChanged(QLineEdit*)),
Qt::QueuedConnection);
} TLineEditIP::~TLineEditIP()
{ } void TLineEditIP::paintEvent(QPaintEvent *event)
{
QLineEdit::paintEvent(event);
QPainter painter(this);
QBrush brush;
brush.setStyle(Qt::BrushStyle::SolidPattern);
brush.setColor(Qt::black);
painter.setBrush(brush); int width = ;
for (int i = ; i < ; i++)
{
width += m_lineEidt[i]->width() + (i == ? : );//布局的间隔
painter.drawEllipse(width, height() / - , , );
}
} QString TLineEditIP::getIPItemStr(unsigned char item)
{
return QString("%1\n").arg(item);
} void TLineEditIP::slotTextChanged(QLineEdit* pEdit)
{
for (unsigned int i = ; i != QTUTL_IP_SIZE; ++i)
{
if (pEdit == m_lineEidt[i])
{
if (pEdit->text().size() == getIPItemStr(UCHAR_MAX).size() &&
pEdit->text().size() == pEdit->cursorPosition())
{
// auto-move to next item
if (i + != QTUTL_IP_SIZE)
{
m_lineEidt[i + ]->setFocus();
m_lineEidt[i + ]->selectAll();
}
}
}
}
} int TLineEditIP::getIndex(QLineEdit *pEdit)
{
int index = -;
for (int i = ; i < ; i++)
{
if (pEdit == m_lineEidt[i])
index = i;
}
return index;
} bool TLineEditIP::eventFilter(QObject *obj, QEvent *event)
{
bool bRes = QLineEdit::eventFilter(obj, event);
if (event->type() == QEvent::Show)
{
if (obj == this)
{
m_lineEidt[]->setFocus();
m_lineEidt[]->setCursorPosition(m_lineEidt[]->text().size());
m_lineEidt[]->selectAll();
}
}
else if (event->type() == QEvent::KeyPress)
{
QKeyEvent* pEvent = dynamic_cast<QKeyEvent*>(event);
if (pEvent)
{
for (unsigned int i = ; i != QTUTL_IP_SIZE; ++i)
{
QLineEdit* pEdit = m_lineEidt[i];
if (pEdit == obj)
{
switch (pEvent->key())
{
case Qt::Key_Left:
if (pEdit->cursorPosition() == )
{
// user wants to move to previous item
m_lineEidt[i > ? i - : QTUTL_IP_SIZE - ]->setFocus();
m_lineEidt[i > ? i - : QTUTL_IP_SIZE - ]->setCursorPosition(m_lineEidt[i > ? i - : QTUTL_IP_SIZE - ]->text().size());
m_lineEidt[i > ? i - : QTUTL_IP_SIZE - ]->selectAll();
}
break;
case Qt::Key_Right:
if (pEdit->text().isEmpty() ||(pEdit->text().size() == pEdit->cursorPosition()))
{
// user wants to move to next item
m_lineEidt[i + != QTUTL_IP_SIZE ? i + : ]->setFocus();
m_lineEidt[i + != QTUTL_IP_SIZE ? i + : ]->setCursorPosition();
}
break;
case Qt::Key_Return:
case Qt::Key_Tab:
{
m_lineEidt[i + != QTUTL_IP_SIZE ? i + : ]->setFocus();
m_lineEidt[i + != QTUTL_IP_SIZE ? i + : ]->setCursorPosition();
m_lineEidt[i + != QTUTL_IP_SIZE ? i + : ]->selectAll();
return true;
}
case Qt::Key_Backspace:
{
QString strText = pEdit->text();
if (!strText.length() || strText.length() && !pEdit->cursorPosition())
{
int index = getIndex(pEdit);
if (index != - && index != )
{
m_lineEidt[index - ]->setFocus();
int length = m_lineEidt[index - ]->text().length();
m_lineEidt[index - ]->setCursorPosition(length ? length : );
}
}
return QLineEdit::eventFilter(obj, event);
}
default:
emit signalTextChanged(pEdit);
}
break;
}
}
}
}
return bRes;
}
void TLineEditIP::setText(const QString &strIP)
{
if (!isTextValid(strIP))
{
QMessageBox::warning(this, "Attention", "Your IP Address is Invalid!", QMessageBox::StandardButton::Ok);
return;
}
else
{
int i = ;
QStringList ipList = strIP.split(".");
foreach (const QString &ip, ipList)
{
m_lineEidt[i]->setText(ip);
i++;
}
}
m_lineEidt[]->selectAll();
} bool TLineEditIP::isTextValid(const QString &strIP)
{
QRegExp rx2("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");
if (!rx2.exactMatch(strIP))
return false;
return true;
} QString TLineEditIP::text() const
{
return QString("%1.%2.%3.%4")
.arg(m_lineEidt[]->text().isEmpty() ? "" : m_lineEidt[]->text())
.arg(m_lineEidt[]->text().isEmpty() ? "" : m_lineEidt[]->text())
.arg(m_lineEidt[]->text().isEmpty() ? "" : m_lineEidt[]->text())
.arg(m_lineEidt[]->text().isEmpty() ? "" : m_lineEidt[]->text());
}
2.通过QLineEdit成员函数setInputMask("000.000.000.000;_")+setValidator也能实现相关IP输入(但光标效果和删除效果不大理想,具体接口可参看QLineEdit文档);
QLineEdit IP地址校验的更多相关文章
- IP地址校验
function validIp(fieldname,fielddesc){ var value = $.trim($("#key_"+fieldname).val()); var ...
- 正则表达式 - IP地址、Mac地址、端口、经纬度、车牌号码校验
IP地址验证: /^(\d|[1-9]\d|1\d{2}|2[0-5][0-5])\.(\d|[1-9]\d|1\d{2}|2[0-5][0-5])\.(\d|[1-9]\d|1\d{2}|2[0 ...
- C# 校验给定的ip地址是否合法
函数用于检测ip地址格式是否合法,包括ip的组成格式,每隔段是否不超过255等,但这个函数不能验证这个ip地址是否可以ping通. /// <summary> /// 验证IP地址是否合法 ...
- 校验ip地址的格式
/*输入:strIP:ip地址 返回:如果通过验证返回true,否则返回false: */ function isIP(strIP) { if (isNull(strIP)) return false ...
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等
<script type="text/javascript">/* * 手机号码格式 * 只允许以13.15.18开头的号码 * 如:13012345678.15929 ...
- IP地址(IPv4)/IPv6地址的正则表达式
原地址:http://pfeishao.blog.163.com/blog/static/18162337020112113130453/ Pv4地址正则表达式:^((25[0-5]|2[0-4]\d ...
- 整数与IP地址间的转换
描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数.举例:一个ip地址为10.0.3.193每段数字 ...
- java正则表达式小练习(IP地址检测、排序,叠词的处理,邮件地址的获取)
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.reg ...
- NetSetMan IP地址切换工具
http://www.netsetman.com/en/freeware NetSetMan NetSetMan是一个网络设置管理器,它可以很容易在6种不同的,视觉结构化的配置之间切换,包括: IP地 ...
随机推荐
- ReactiveCocoa源码解析(六) SignalProtocol的take(first)与collect()延展实现
上篇博客我们聊了observe().map().filter()延展函数的具体实现方式以及使用方式.我们在之前的博客中已经聊过,Signal的主要功能是位于SignalProtocol的协议延展中的, ...
- 欢迎大家Follow me!微软MVP罗勇(Dynamics CRM方向)欢迎您!
我是一名八零后,来自湖南乡村,2002年毕业于大连大学工商管理专业,主要靠自学走上了编程之路.从2012年开始接触Dynamics CRM 2011,一直从事Dynamics CRM方面工作,熟悉Dy ...
- Linux 下搭建www服务器
偶然的机会接触了前端开发,尽管最初的意愿是后台. 不过现在看来,前端后台数据库密不可分! 回想起来感觉自己学习的层次也还很好,因为之前有学习c语言.c++的基础,所以在学习html,js的过程中感觉还 ...
- 剥析surging的架构思想
1.前言 前面第一篇阐述了采用基于.NET CORE微服务架构,应用surging服务端与客户端之间进行通信的简单示例以及对于surging服务化框架简单介绍.在这篇文章中,我们将剥析surgin ...
- JS的get和set使用示例
javascript中set与get方法详解 其中get与set的使用方法: 1.get与set是方法,因为是方法,所以可以进行判断. 2.get是得到 一般是要返回的 set 是设置 不用返回 ...
- MyBatis的关联关系 一对一 一对多 多对多
一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...
- [C++]智能指针的实现与使用
智能指针 智能指针是当我们在使用对象时,有时会把对象的内存分配在堆上忘记释放,导致内存泄露,并且当多个指针共享同一个对象的内存时,容易出现重复释放内存,导致错误. 我们针对所需要共享的对象,手动完成一 ...
- http调用端HttpClient、DefaultHttpClient、CloseableHttpClient
1:说下httpClient接口和4.2.6版本后过时实例DefaultHttpClient,以及新的实例应用. 说到HTTP,脑子就冒出它的特性,基于TCP协议,简短点:说明是交互性的. 2:下面 ...
- Caused by: org.apache.catalina.LifecycleException: A child container failed during start
错误提示: 严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache. ...
- (转)每天一个linux命令(28):tar命令
场景:Linux环境中压缩和解压的命令经常会使用到,所以学好这个命令很有必要! 原文出处:http://www.cnblogs.com/peida/archive/2012/11/30/2795656 ...