基于qt平台的ip地址输入控件

说明

qt编写的ip地址输入控件,功能齐全,非常实用,使用提升法集成到自己项目的ui中即可。提供设置ip和获取ip两个接口。具体看代码,比较简单,注释应该比较详细了,下载地址放在文章尾部。
在这里插入图片描述

代码

ipinputcontrol.h

#ifndef IPINPUTCONTROL_H
#define IPINPUTCONTROL_H

#include <QWidget>
#include <QKeyEvent>
#include <QRegExpValidator>

QT_BEGIN_NAMESPACE
namespace Ui { class ipInputControl; }
QT_END_NAMESPACE

class ipInputControl : public QWidget
{
    Q_OBJECT

public:
    ipInputControl(QWidget *parent = nullptr);
    ~ipInputControl();
signals:
    void warningIP(const QString&);
public slots:
    QString getIP() const;
    void setIP(const QString&);
private:
    void keyPressEvent(QKeyEvent*);
    bool eventFilter(QObject*, QEvent*);
    void checkInput(const QString&);
private:
    Ui::ipInputControl *ui;
};
#endif // IPINPUTCONTROL_H

ipinputcontrol.cpp

#include "ipinputcontrol.h"
#include "ui_ipinputcontrol.h"
#include <QDebug>
#define outlog qDebug()
ipInputControl::ipInputControl(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::ipInputControl)
{
    ui->setupUi(this);

    //设置IP地址校验,禁止输入非法字符
    QRegExp regExp("(2[0-5]{2}|2[0-4][0-9]|1?[0-9]{1,2})");
    QRegExpValidator *validator = new QRegExpValidator(regExp, this);
    ui->lineEdit->setValidator(validator);
    ui->lineEdit_2->setValidator(validator);
    ui->lineEdit_3->setValidator(validator);
    ui->lineEdit_4->setValidator(validator);

    //设置Tab键按下时的切换顺序
    QWidget::setTabOrder(ui->lineEdit, ui->lineEdit_2);
    QWidget::setTabOrder(ui->lineEdit_2, ui->lineEdit_3);
    QWidget::setTabOrder(ui->lineEdit_3, ui->lineEdit_4);
    QWidget::setTabOrder(ui->lineEdit_4, ui->lineEdit);

    //在窗体上为lineEdit安装事件过滤器
    ui->lineEdit->installEventFilter(this);
    ui->lineEdit_2->installEventFilter(this);
    ui->lineEdit_3->installEventFilter(this);
    ui->lineEdit_4->installEventFilter(this);

    //输入时做检查
    connect(ui->lineEdit, &QLineEdit::textChanged, this, &ipInputControl::checkInput);
    connect(ui->lineEdit_2, &QLineEdit::textChanged, this, &ipInputControl::checkInput);
    connect(ui->lineEdit_3, &QLineEdit::textChanged, this, &ipInputControl::checkInput);
    connect(ui->lineEdit_4, &QLineEdit::textChanged, this, &ipInputControl::checkInput);
}

ipInputControl::~ipInputControl()
{
    delete ui;
}

//检查ip地址输入,若输入超过2位或2位数值大于25时,发送事件自动切换到下一个输入口
void ipInputControl::checkInput(const QString& text)
{
    if(ui->lineEdit_4->hasFocus())
    {
        return ;
    }
    if(text.length() > 2)
    {
        QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
        qApp->sendEvent(this, &myEvent);
    }
    else if(text.length() == 2)
    {
        int temp = text.toInt();
        if(temp > 25)
        {
            QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
            qApp->sendEvent(this, &myEvent);
        }
    }
}
//回车键可以对输入做检查
void ipInputControl::keyPressEvent(QKeyEvent* e)
{
    if(e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)
    {
        QString ipSub1 = ui->lineEdit->text();
        QString ipSub2 = ui->lineEdit_2->text();
        QString ipSub3 = ui->lineEdit_3->text();
        QString ipSub4 = ui->lineEdit_4->text();
        if(ipSub1.isEmpty() || ipSub2.isEmpty() || ipSub3.isEmpty() || ipSub4.isEmpty())
        {
            emit warningIP("ip address input error.");
            outlog<<"ip address input is error.";
        }
        else
        {
            QString ipString = ipSub1 + "." + ipSub2 + "." + ipSub3 + "." + ipSub4;
            outlog << "ipString: " << ipString;
        }
    }
}
bool ipInputControl::eventFilter(QObject *watched, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
        QLineEdit *txt = (QLineEdit *)watched;
        if (txt == ui->lineEdit || txt == ui->lineEdit_2 || txt == ui->lineEdit_3 || txt == ui->lineEdit_4)
        {
            QKeyEvent *key = (QKeyEvent *)event;

            //如果当前按下了小数点则移动焦点到下一个输入框
            if (key->text() == ".")
            {
                if(ui->lineEdit->hasFocus())
                    ui->lineEdit_2->setFocus();
                else if(ui->lineEdit_2->hasFocus())
                    ui->lineEdit_3->setFocus();
                else if(ui->lineEdit_3->hasFocus())
                    ui->lineEdit_4->setFocus();
                else if(ui->lineEdit_4->hasFocus())
                    ui->lineEdit->setFocus();
            }

            //如果按下了退格键并且当前文本框已经没有了内容则焦点往前移
            if (key->key() == Qt::Key_Backspace)
            {
                if (txt->text().length() <= 1)
                {
                    if(ui->lineEdit_2->hasFocus())
                        ui->lineEdit->setFocus();
                    else if(ui->lineEdit_3->hasFocus())
                        ui->lineEdit_2->setFocus();
                    else if(ui->lineEdit_4->hasFocus())
                        ui->lineEdit_3->setFocus();
                }
            }
        }
    }
    return QWidget::eventFilter(watched, event);
}
//返回ip地址字符串,用于获取
QString ipInputControl::getIP() const
{
    QString ipSub1 = ui->lineEdit->text();
    QString ipSub2 = ui->lineEdit_2->text();
    QString ipSub3 = ui->lineEdit_3->text();
    QString ipSub4 = ui->lineEdit_4->text();
    if(ipSub1.isEmpty() || ipSub2.isEmpty() || ipSub3.isEmpty() || ipSub4.isEmpty())
    {
        return "";
    }
    return ipSub1 + "." + ipSub2 + "." + ipSub3 + "." + ipSub4;;
}
//从ip地址字符串设置到ui
void ipInputControl::setIP(const QString& text)
{
    QStringList ipList = text.split(".");
    if(ipList.size() != 4)
    {
        emit warningIP("ip address format is error.");
        outlog<<"ip address format is error.";
        return;
    }
    ui->lineEdit->setText(ipList.at(0));
    ui->lineEdit_2->setText(ipList.at(1));
    ui->lineEdit_3->setText(ipList.at(2));
    ui->lineEdit_4->setText(ipList.at(3));
}

下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值