QLineEdit IP地址校验

source link:http://www.cppblog.com/cctoqh/archive/2011/06/03/148018.html

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 = 0);
    ~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[4];
};

#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(4);
    pHBox->setContentsMargins(4,4,2,4);
    for (int i = 0; i < 4; i++)
    {
        m_lineEidt[i] = new QLineEdit(this);
        m_lineEidt[i]->setFrame(false);
        m_lineEidt[i]->setMaxLength(3);
        m_lineEidt[i]->setTextMargins(0,0,0,0);
        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, 0);
        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 = 0;
    for (int i = 0; i < 3; i++)
    {
        width += m_lineEidt[i]->width() + (i == 0 ? 4 : 5);//布局的间隔
        painter.drawEllipse(width, height() / 2 - 1, 1, 1);
    }
}

QString TLineEditIP::getIPItemStr(unsigned char item)
{
    return QString("%1\n").arg(item);
}

void TLineEditIP::slotTextChanged(QLineEdit* pEdit)
{
    for (unsigned int i = 0; 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 + 1 != QTUTL_IP_SIZE)
                {
                    m_lineEidt[i + 1]->setFocus();
                    m_lineEidt[i + 1]->selectAll();
                }
            }
        }
    }
}

int TLineEditIP::getIndex(QLineEdit *pEdit)
{
    int index = -1;
    for (int i = 0; i < 4; 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[0]->setFocus();
            m_lineEidt[0]->setCursorPosition(m_lineEidt[0]->text().size());
            m_lineEidt[0]->selectAll();
        }
    }
    else if (event->type() == QEvent::KeyPress)
    {
        QKeyEvent* pEvent = dynamic_cast<QKeyEvent*>(event);
        if (pEvent)
        {
            for (unsigned int i = 0; i != QTUTL_IP_SIZE; ++i)
            {
                QLineEdit* pEdit = m_lineEidt[i];
                if (pEdit == obj)
                {
                    switch (pEvent->key())
                    {
                    case Qt::Key_Left:
                        if (pEdit->cursorPosition() == 0)
                        {
                            // user wants to move to previous item
                            m_lineEidt[i > 0 ? i - 1 : QTUTL_IP_SIZE - 1]->setFocus();
                            m_lineEidt[i > 0 ? i - 1 : QTUTL_IP_SIZE - 1]->setCursorPosition(m_lineEidt[i > 0 ? i - 1 : QTUTL_IP_SIZE - 1]->text().size());
                            m_lineEidt[i > 0 ? i - 1 : QTUTL_IP_SIZE - 1]->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 + 1 != QTUTL_IP_SIZE ? i + 1 : 0]->setFocus();
                            m_lineEidt[i + 1 != QTUTL_IP_SIZE ? i + 1 : 0]->setCursorPosition(0);
                        }
                        break;
                    case Qt::Key_Return:
                    case Qt::Key_Tab:
                    {
                        m_lineEidt[i + 1 != QTUTL_IP_SIZE ? i + 1 : 0]->setFocus();
                        m_lineEidt[i + 1 != QTUTL_IP_SIZE ? i + 1 : 0]->setCursorPosition(0);
                        m_lineEidt[i + 1 != QTUTL_IP_SIZE ? i + 1 : 0]->selectAll();
                        return true;
                    }
                    case Qt::Key_Backspace:
                    {
                        QString strText = pEdit->text();
                        if (!strText.length() || strText.length() && !pEdit->cursorPosition())
                        {
                            int index = getIndex(pEdit);
                            if (index != -1 && index != 0)
                            {
                                m_lineEidt[index - 1]->setFocus();
                                int length = m_lineEidt[index - 1]->text().length();
                                m_lineEidt[index - 1]->setCursorPosition(length ? length : 0);
                            }
                        }
                        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 = 0;
        QStringList ipList = strIP.split(".");
        foreach (const QString &ip, ipList)
        {
            m_lineEidt[i]->setText(ip);
            i++;
        }
    }
    m_lineEidt[0]->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[0]->text().isEmpty() ? "0" : m_lineEidt[0]->text())
        .arg(m_lineEidt[1]->text().isEmpty() ? "0" : m_lineEidt[1]->text())
        .arg(m_lineEidt[2]->text().isEmpty() ? "0" : m_lineEidt[2]->text())
        .arg(m_lineEidt[3]->text().isEmpty() ? "0" : m_lineEidt[3]->text());
}

2.通过QLineEdit成员函数setInputMask("000.000.000.000;_")+setValidator也能实现相关IP输入(但光标效果和删除效果不大理想,具体接口可参看QLineEdit文档);

时间: 2024-10-12 19:42:00

QLineEdit IP地址校验的相关文章

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

函数用于检测ip地址格式是否合法,包括ip的组成格式,每隔段是否不超过255等,但这个函数不能验证这个ip地址是否可以ping通. /// <summary> /// 验证IP地址是否合法 /// </summary> /// <param name="ip">要验证的IP地址</param> public static bool IsIP(string ip) { //如果为空,认为验证合格 if (IsNullOrEmpty(ip))

js判断ip地址,子网掩码,网关的逻辑性检查

因为要做静态地址配置的js校验,找了好多资料发现网上都是关于ip,mask的有效性检查,没有ip,submask,gateway的逻辑性判断,自己写下代码供需要的人参考. 普及下网关地址知识: 就是进行与运算1与1得1,1与0为0,0与0为0.首先把ip和子网掩码展开 10.70.64.223 00001010 .01000110.01000000.11011111 255.255.255.0 111111111.11111111.11111111.00000000 网段就是 00001010

使用Java技术获取客户端的IP地址

今天发文一篇较为简单,且文档满天飞的获取IP地址的java代码,可能很多小白们不一定能找到完整兼容的方法,故在此送给小白们一份干货. 此文也是为了接下来的时间里,我将会写一篇使用HTML5技术扫描PC二维码且在WAP端实现可上传图片或视频的文档,这里会运用到根据参数动态生成二维码和传输文件的技术,也会应用到ip及端口的东西. 下面是运用java代码判断当前客服端IP地址的逻辑: private String getInternetIp(HttpServletRequest request) {

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

import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; class MyComparator implements Comparator<String>{ public int compare(String ip1, String ip2) { Pattern p

恢复所有情况的ip地址

在终端下输入一串ip字符串如:19219219211,ip地址可能是19.219.219.211.192.19.219.211.192.192.19.211和192.192.192.11. 以下是本人造的轮子,代码看起来比较粗糙. 1 #include <stdio.h> 2 #include <string.h> 3 4 /** 5 * 检测地址段是否合法 6 * @param i 个十百位情况,所以情况是0.1和2 7 * @param addr IP段字符串 8 * @par

NetSetMan IP地址切换工具

http://www.netsetman.com/en/freeware NetSetMan NetSetMan是一个网络设置管理器,它可以很容易在6种不同的,视觉结构化的配置之间切换,包括: IP地址(IPv4的和IPv6!) 网关(包括跃点数 Metric) DNS 服务器 WINS 服务器 WiFi 管理 计算机名 工作组 默认打印机 网络驱动器 网卡状态 连接(RAS/DUN/PPP/VPN) DNS 后缀 路由表 SMTP 服务器 Hosts 文件条目 系统设置 MAC 地址 脚本(B

&nbsp; &nbsp; &nbsp; CCNA入门基础之 IP地址

CCNA入门基础之 IP地址 IP(Internet Protocol),意思是"网络之间互连的协议",也就是为计算机网络相互连接进行通信而设计的协议.在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则.任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通.IP地址是指互联网协议地址(Internet Protocol Address,又译为网际协议地址).IP地址是IP协议提供的一种统一主机编址的方式的地址

【华为OJ】【030-整数与IP地址间的转换】

[华为OJ][算法总篇章] [华为OJ][030-整数与IP地址间的转换] [工程下载] 题目描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数. 举例:一个ip地址为10.0.3.193 每段数字 相对应的二进制数 10 00001010 0 00000000 3 00000011 193 11000001 组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:1

整数与IP地址间的转换

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