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. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  2. peoplesoft function PSTREENODE 通过 deptid 获得部门树 全路径 code

    create or replace function getUnitFullcode(deptid in varchar) return varchar2 is r ); c int; n ); m ...

  3. [图形学] 计算机图形学 with OpenGL开篇

    <计算机图形学>(第四版)正在学习中,学习目的是为了在Unity中使用shader实现不同的渲染效果. 希望在这里能把学习过程中学到的知识和遇到的问题记录下来. 工作环境是:Xcode 8 ...

  4. English - Green Peanut Butter

    There is a guy. He wants to drink 12 cups of green peanut butter. He needs green peanut butter. So h ...

  5. JavaWeb 后端 <六> 之 EL & JSTL 学习笔记

    一.EL表达式(特别重要)

  6. springBoot基础系列--properties配置

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7183408.html SpringBoot中免除了大部分手动配置,但是对于一些特定的情况, ...

  7. requirejs 加载其它js

    基本代码: require.config({ // baseUrl : '/js/' paths: { jquery: '/js/jquery-1.11.3.min', validate: '/js/ ...

  8. linux中grep命令的用法

    作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的. 首先谈一下grep命令的常用格式为:[grep  [选项]  "模式"  [ ...

  9. JQuery学习笔记——基础选择器

    第一篇博客,现在原生安卓需求不大了.招聘的Android工程师都需要附带更多的其他技术.这也是开启我学习前端之路的开端.前端时间看了HTML.CSS等,在界面渲染这一块,就不多记录博客了.现在学习着J ...

  10. FreeRTOS——队列管理

    1. 队列主要用于任务与任务.中断与任务之间的消息传递. 2. 创建队列时,请注意队列中数据单元的长度. 3. 通常情况,队列被作为FIFO(先进先出)使用,即数据从队列尾写入,从队列首读.当然,数据 ...