qt 自定义的ip控件

qt默认没有ip控件,那就自己封装一个 ,window和linux均可使用
直接上代码
1、myipaddredit.h

#pragma once 

#include <QFrame>
#include <QMouseEvent>
#include <QKeyEvent>

class QLineEdit; 
class QLabel; 
class MyIpPartLineEdit; 

class MyIpAddrEdit : public QWidget
{ 
    Q_OBJECT 
public: 
    MyIpAddrEdit(QWidget* pParent = 0);
    ~MyIpAddrEdit(); 

    void setText(const QString &text);
    QString text();  
    void setHight(int hight);
    void clear();
    bool checkInlegal();
protected:
    bool eventFilter(QObject *watched, QEvent *event);

signals: 
    void textchanged(const QString& text); 
    void textedited(const QString &text); 

private slots: 
    void textchangedslot(const QString& text); 
    void texteditedslot(const QString &text); 

private: 
    MyIpPartLineEdit *ip_part1_; //ip的四段
    MyIpPartLineEdit *ip_part2_; 
    MyIpPartLineEdit *ip_part3_; 
    MyIpPartLineEdit *ip_part4_;

    QLabel *labeldot1_; //'.'号
    QLabel *labeldot2_;     
    QLabel *labeldot3_; 
};

1、myipaddredit.cpp

#include "myipaddredit.h" 
#include <QRegExpValidator> 
#include <QLabel> 
#include "myippartlineedit.h"
#include <QHBoxLayout>
#include <QClipboard>
#include <QApplication>

MyIpAddrEdit::MyIpAddrEdit(QWidget* pParent /* = 0 */)
: QWidget(pParent)
{ 
    ip_part1_ = new MyIpPartLineEdit(this, 1);
    ip_part2_ = new MyIpPartLineEdit(this, 2);
    ip_part3_ = new MyIpPartLineEdit(this, 3);
    ip_part4_ = new MyIpPartLineEdit(this, 4);

    labeldot1_ = new QLabel(this); 
    labeldot2_ = new QLabel(this); 
    labeldot3_ = new QLabel(this);
    //labeldot1_->setStyleSheet("QLabel{background-color: rgb(255, 255, 255);}");
    //labeldot2_->setStyleSheet("QLabel{background-color: rgb(255, 255, 255);}");
    //labeldot3_->setStyleSheet("QLabel{background-color: rgb(255, 255, 255);}");

    //setStyleSheet("background-color: rgb(255, 255, 255);");
    QHBoxLayout *hlayout = new QHBoxLayout;
    hlayout->setMargin(1);
    //hlayout->setContentsMargins(1,0,0,0);

    hlayout->setSpacing(0);
    hlayout->addWidget(ip_part1_);
    hlayout->addWidget(labeldot1_);
    hlayout->addWidget(ip_part2_);
    hlayout->addWidget(labeldot2_);
    hlayout->addWidget(ip_part3_);
    hlayout->addWidget(labeldot3_);
    hlayout->addWidget(ip_part4_);
    this->setLayout(hlayout);

    labeldot1_->setText(".");

    labeldot1_->setAlignment(Qt::AlignCenter);

    labeldot2_->setText(".");

    labeldot2_->setAlignment(Qt::AlignCenter);

    labeldot3_->setText(".");

    labeldot3_->setAlignment(Qt::AlignCenter);

    QWidget::setTabOrder(ip_part1_, ip_part2_); 
    QWidget::setTabOrder(ip_part2_, ip_part3_); 
    QWidget::setTabOrder(ip_part3_, ip_part4_); 
    ip_part1_->set_nexttab_edit(ip_part2_);
    ip_part2_->set_nexttab_edit(ip_part3_); 
    ip_part3_->set_nexttab_edit(ip_part4_);

    ip_part2_->set_pritab_edit(ip_part1_);
    ip_part3_->set_pritab_edit(ip_part2_);
    ip_part4_->set_pritab_edit(ip_part3_);


    connect(ip_part1_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&))); 
    connect(ip_part2_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&))); 
    connect(ip_part3_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&))); 
    connect(ip_part4_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&))); 

    connect(ip_part1_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&))); 
    connect(ip_part2_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&))); 
    connect(ip_part3_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&))); 
    connect(ip_part4_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&))); 
    ip_part1_->installEventFilter(this);
    ip_part2_->installEventFilter(this);
    ip_part3_->installEventFilter(this);
    ip_part4_->installEventFilter(this);
     
} 

MyIpAddrEdit::~MyIpAddrEdit() 
{ 

} 

void MyIpAddrEdit::textchangedslot(const QString& /*text*/) 
{ 
    QString ippart1, ippart2, ippart3, ippart4; 
    ippart1 = ip_part1_->text(); 
    ippart2 = ip_part2_->text(); 
    ippart3 = ip_part3_->text(); 
    ippart4 = ip_part4_->text(); 

    QString ipaddr = QString("%1.%2.%3.%4") 
                     .arg(ippart1) 
                     .arg(ippart2) 
                     .arg(ippart3) 
                     .arg(ippart4); 

    emit textchanged(ipaddr);
} 

void MyIpAddrEdit::texteditedslot(const QString &/*text*/) 
{ 
    QString ippart1, ippart2, ippart3, ippart4; 
    ippart1 = ip_part1_->text(); 
    ippart2 = ip_part2_->text(); 
    ippart3 = ip_part3_->text(); 
    ippart4 = ip_part4_->text(); 

    QString ipaddr = QString("%1.%2.%3.%4") 
        .arg(ippart1) 
        .arg(ippart2) 
        .arg(ippart3) 
        .arg(ippart4); 

    emit textedited(ipaddr); 
} 

void MyIpAddrEdit::setText(const QString &text)
{ 
    QString ippart1, ippart2, ippart3, ippart4; 
    QString qstring_validate = text; 

    // IP地址验证 
    QRegExp regexp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"); 
    QRegExpValidator regexp_validator(regexp, this); 
    int nPos = 0; 
    QValidator::State state = regexp_validator.validate(qstring_validate, nPos); 
    // IP合法 
    if (state == QValidator::Acceptable) 
    { 
        QStringList ippartlist = text.split("."); 
     
        int strcount = ippartlist.size(); 
        int index = 0; 
        if (index < strcount) 
        { 
            ippart1 = ippartlist.at(index); 
        } 
        if (++index < strcount) 
        { 
            ippart2 = ippartlist.at(index); 
        } 
        if (++index < strcount) 
        { 
            ippart3 = ippartlist.at(index); 
        } 
        if (++index < strcount) 
        { 
            ippart4 = ippartlist.at(index); 
        } 
    } 

    ip_part1_->setText(ippart1); 
    ip_part2_->setText(ippart2); 
    ip_part3_->setText(ippart3); 
    ip_part4_->setText(ippart4); 
} 

QString MyIpAddrEdit::text() 
{ 
    QString ippart1, ippart2, ippart3, ippart4; 
    ippart1 = ip_part1_->text(); 
    ippart2 = ip_part2_->text(); 
    ippart3 = ip_part3_->text(); 
    ippart4 = ip_part4_->text(); 
    if(!this->checkInlegal()) return "";

    return QString("%1.%2.%3.%4") 
        .arg(ippart1) 
        .arg(ippart2) 
        .arg(ippart3) 
            .arg(ippart4);
}

void MyIpAddrEdit::setHight(int hight)
{
    ip_part1_->setFixedHeight(hight);
    ip_part2_->setFixedHeight(hight);
    ip_part3_->setFixedHeight(hight);
    ip_part4_->setFixedHeight(hight);
    labeldot1_->setFixedHeight(hight);
    labeldot2_->setFixedHeight(hight);
    labeldot3_->setFixedHeight(hight);
}

void MyIpAddrEdit::clear()
{
    ip_part1_->clear();
    ip_part2_->clear();
    ip_part3_->clear();
    ip_part4_->clear();
}

bool MyIpAddrEdit::checkInlegal()
{
    return !(ip_part1_->text().isEmpty() || ip_part2_->text().isEmpty() || ip_part3_->text().isEmpty() || ip_part4_->text().isEmpty());
}

bool MyIpAddrEdit::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ip_part1_ || watched == ip_part2_ || watched == ip_part3_ || watched == ip_part4_)
    {
         if (event->type() == QEvent::KeyPress)
         {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if (keyEvent->matches(QKeySequence::Paste))
            {
                if(keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == Qt::Key_V)
                {
                    QClipboard *clipboard = QApplication::clipboard(); //获取系统剪贴板指针
                    QString originalText = clipboard->text();
                    setText(originalText);
                }
            }
         }
    }
}

3、上述代码中的MyIpPartLineEdit类

#pragma once 

#include <QLineEdit> 

class QWidget; 
class QFocusEvent; 
class QKeyEvent; 

class MyIpPartLineEdit : public QLineEdit 
{ 
    Q_OBJECT 
public: 
    MyIpPartLineEdit(QWidget *parent = 0,int index = 0);
    ~MyIpPartLineEdit(void); 

    void set_nexttab_edit(QLineEdit *nexttab) { next_tab_ = nexttab; } 
    void set_pritab_edit(QLineEdit *pritab) {pri_tab_ = pritab;}

protected: 
    //virtual void focusInEvent(QFocusEvent *e);
    virtual void keyPressEvent(QKeyEvent *event);   

private slots: 
    void text_edited(const QString& text); 

private: 
    QLineEdit *next_tab_; 
    QLineEdit *pri_tab_;
}; 

4、myippartlineedit.cpp

#include "myippartlineedit.h" 
#include <QIntValidator> 
#include <QKeyEvent> 

MyIpPartLineEdit::MyIpPartLineEdit(QWidget *parent/* = 0*/,int index)
: QLineEdit(parent) 
{ 
    next_tab_ = NULL; 
    pri_tab_ = NULL;

    this->setFrame(false);
    this->setAlignment(Qt::AlignHCenter);

    QRegExp regexp;
    if(index == 1)
    {
        regexp.setPattern("(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])");
    }else{
        regexp.setPattern("(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)|(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.");
    }

    QRegExpValidator *regexp_validator = new QRegExpValidator(regexp, this);
    this->setValidator(regexp_validator);

    connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(text_edited(const QString&))); 
} 

MyIpPartLineEdit::~MyIpPartLineEdit(void) 
{ 
} 


void MyIpPartLineEdit::keyPressEvent(QKeyEvent *event) 
{ 
    if(event->key() == Qt::Key_Backspace)
    {
        if(pri_tab_ != NULL && this->text().isEmpty())
       {
            pri_tab_->setFocus();
            pri_tab_->selectAll();
        }
    }else if(event->key() == Qt::Key_Left){
        if(pri_tab_ != NULL && cursorPosition() == 0){
            pri_tab_->setFocus();
            pri_tab_->setCursorPosition(pri_tab_->text().size());
        }
    }else if(event->key() == Qt::Key_Right){
        if(next_tab_ != NULL & cursorPosition() == this->text().size()){
            next_tab_->setFocus();
            next_tab_->setCursorPosition(0);
        }
    }
    QLineEdit::keyPressEvent(event); 
} 

void MyIpPartLineEdit::text_edited(const QString& text) 
{ 
    QString chanText = text;
    int index = chanText.indexOf(".");
    if(index >= 0)
    {
        chanText.remove(index,1);
        this->setText(chanText);
        if (next_tab_)
        {
            next_tab_->setFocus();
        }
        return ;
    }
    QIntValidator v(0, 255, this); 
    QString ipaddr = text; 
    int pos = 0; 
    QValidator::State state = v.validate(ipaddr, pos);  
    if (state == QValidator::Acceptable) 
    { 
        if (ipaddr.size() > 1) 
        { 
            if (ipaddr.size() == 2) 
            { 
                int ipnum = ipaddr.toInt(); 
                 
                if (ipnum > 25) 
                { 
                    if (next_tab_) 
                    { 
                        next_tab_->setFocus(); 
                        next_tab_->selectAll(); 
                    }     
                } 
            } 
            else 
            { 
                if (next_tab_) 
                { 
                    next_tab_->setFocus(); 
                    next_tab_->selectAll(); 
                }     
            } 
        } 
    } 
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值