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地址校验的更多相关文章

  1. IP地址校验

    function validIp(fieldname,fielddesc){ var value = $.trim($("#key_"+fieldname).val()); var ...

  2. 正则表达式 - 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 ...

  3. C# 校验给定的ip地址是否合法

    函数用于检测ip地址格式是否合法,包括ip的组成格式,每隔段是否不超过255等,但这个函数不能验证这个ip地址是否可以ping通. /// <summary> /// 验证IP地址是否合法 ...

  4. 校验ip地址的格式

    /*输入:strIP:ip地址 返回:如果通过验证返回true,否则返回false: */ function isIP(strIP) { if (isNull(strIP)) return false ...

  5. 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等

    <script type="text/javascript">/* * 手机号码格式 * 只允许以13.15.18开头的号码 * 如:13012345678.15929 ...

  6. IP地址(IPv4)/IPv6地址的正则表达式

    原地址:http://pfeishao.blog.163.com/blog/static/18162337020112113130453/ Pv4地址正则表达式:^((25[0-5]|2[0-4]\d ...

  7. 整数与IP地址间的转换

    描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数.举例:一个ip地址为10.0.3.193每段数字            ...

  8. java正则表达式小练习(IP地址检测、排序,叠词的处理,邮件地址的获取)

    import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.reg ...

  9. NetSetMan IP地址切换工具

    http://www.netsetman.com/en/freeware NetSetMan NetSetMan是一个网络设置管理器,它可以很容易在6种不同的,视觉结构化的配置之间切换,包括: IP地 ...

随机推荐

  1. MySQL(一)--基本语法与常用语句

    将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库(Database,DB). 将姓名.住址.电话号码.邮箱地址.爱好和家庭构成等数据保存到数据库中,就可以随时迅速获取想要的 ...

  2. 关于SpringMVC中text/plain的编码导致的乱码问题解决方法

    有老铁的项目出现个问题,就是用SpringMVC给前台返回一句话,是String类型的,然后前台接收到是乱码. 然后以为是简单的response的编码问题,就在方法体中开始给response设置编码, ...

  3. HDOJ 1260 DP

    Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  4. 访问Access日期字段

    在使用sql访问Access日期字段,应在变量前后加#,例子: s:=Format(select xueshID,name,times,qukbz,skdate,banji from dianmjil ...

  5. acm->stl

    容器 queue 队列 定义 queue的定义需要两个参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque类型 基本方法 push(x) 入队,将x接到队列的末端 ...

  6. 业余草推荐18个Java开源免费的CMS系统

    1.InfoGlue infoglue是一个高级的.可扩展的.健壮的内容管理系统,完全用Java开发.重要的功能包括完全支持多语言,站点之间良好的重用,以及广泛的集成能力. 该项目主页:http:// ...

  7. MongoDB数据库聚合

    前面的话 聚合操作主要用于对数据的批量处理,将记录按条件分组以后,然后再进行一系列操作,例如,求最大值.最小值.平均值,求和等操作.聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘.在 ...

  8. ZooKeeper快速学习

    "一入Java深似海",过去自身对于分布式的接触,始终处于使用别人构建的框架的水平,最多就是在nginx配置一下第4层的负载均衡(最后有介绍).随着java使用深入,本文将重点理解 ...

  9. tensorflow tanh应用

    1.tanh()函数 tanh是双曲函数中的一个,tanh()为双曲正切. 双曲正切函数的导数公式:   2.tensorflow tanh()例子 import tensorflow as tf i ...

  10. HTTP文件下载JAVA后台的实现

    HTTP文件的下载后台JAVA代码 1.使用org.apache.http.impl.client.CloseableHttpClient 先上代码: public String downloadFi ...