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地 ...
随机推荐
- Configure: error: freetype.h not found. 的解决办法
出现 Configure: error: freetype.h not found. 的解决办法 CentOS yum install freetype-devel Debian apt-get in ...
- git常用基本命令
一定要以管理员的身份打开,否则有些命令不能用,比如ssh -T git@github.com(查看配置ssh是否成功)@初始化git git config --global user.name ruo ...
- Watson Explorer Analytical Components 3 - use case scenarios
The followings are the user case scenarios that WEX can be used for generating value. 1.Customer Ins ...
- JavaScript一个google地图获取
<script type="text/javascript"> /** * 返回一个新创建的<img>元素,该元素用于在获取到地理位置信息后,显示一张Goo ...
- spring boot 事件发布与接收
1.创建发布对象 LoginEvent 2.在要发布对象的地方注入 ApplicationEventPublisher @Autowired ApplicationEventPublisher pub ...
- elasticsearch REST API方式批量插入数据
elasticsearch REST API方式批量插入数据 1:ES的服务地址 http://127.0.0.1:9600/_bulk 2:请求的数据体,注意数据的最后一行记得加换行 { &quo ...
- nodejs-ORM 操作数据库中间件waterline的使用
waterline和Sails.js同一团队开发,支持几乎所有的主流数据库,是nodejs下一款非常强大的orm,可以显著提升开发效率 一.waterline支持的数据库 二.waterline的配置 ...
- 简单介绍Struts2
Struts2概述 Struts2虽然是Struts1的基础上发展起来的,但是实质上是以WebWork框架为核心,为传统的Struts1注入了WebWork的设计理念,统一了Struts1和WebWo ...
- Threads(线程)(二)
前一章我们提到了同步异步,多线程:在开始今天的文章之前,先来总结一下上一篇文章的内容,多线程的优点. 多线程有哪些优点呢,在这里通过代码依次来总结. 异步多线程的三大特点 1)同步方法卡界面,原因是主 ...
- (转)Linux修改SSH登录欢迎语
场景:感觉这样做挺个性的,做个记录! 1 Linux修改SSH的欢迎语 众所周知,Linux系统并没有像Windows一样自带远程桌面连接,虽然可以通过后期安装VNC之类的软件来弥补这个缺点,但用了L ...