QT中封装的IP地址的widget

QT没有提供一个完整的IP地址控件,

1. 可以使用QLineEdit简单的实现
    QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
    QRegExpValidator
*pValidator = new QRegExpValidator(regExp, this);
    QLineEdit
*lineEdit = new QLineEdit(this);
    lineEdit
->setValidator(new QRegExpValidator(pValidator, this));
    lineEdit
->setInputMask("000.000.000.000;");
但是上面的输入时没有window的IP地址控件好用。所以自己就用4个QLineEdit封装了一个,用起来好多了,
下面是代码:
// MyIpPartLineEdit.h
#pragma once

#include
<QLineEdit>

class QWidget;
class QFocusEvent;
class QKeyEvent;

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

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

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

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

private:
    QLineEdit
*next_tab_;
};
// MyIpPartLineEdit.cpp
#include "MyIpPartLineEdit.h"
#include
<QIntValidator>
#include
<QKeyEvent>

MyIpPartLineEdit::MyIpPartLineEdit(QWidget
*parent/* = 0*/)
: QLineEdit(parent)
{
    next_tab_
= NULL;

   
this->setMaxLength(3);
   
this->setFrame(false);
   
this->setAlignment(Qt::AlignCenter);

    QValidator
*validator = new QIntValidator(0, 255, this);
   
this->setValidator(validator);

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

MyIpPartLineEdit::
~MyIpPartLineEdit(void)
{
}

void MyIpPartLineEdit::focusInEvent(QFocusEvent *e)
{
   
this->selectAll();
    QLineEdit::focusInEvent(e);
}

void MyIpPartLineEdit::keyPressEvent(QKeyEvent *event)
{
   
if (event->key() == Qt::Key_Period)
    {
       
if (next_tab_)
        {
            next_tab_
->setFocus();
            next_tab_
->selectAll();
        }
    }
    QLineEdit::keyPressEvent(
event);
}

void MyIpPartLineEdit::text_edited(const QString& text)
{
    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();
                }    
            }
        }
    }
}

// MyIpAddrEdit.h
#pragma once

#include
<QWidget>

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 setStyleSheet(const QString &styleSheet);

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_;
    MyIpPartLineEdit
*ip_part2_;
    MyIpPartLineEdit
*ip_part3_;
    QLineEdit
*ip_part4_;

    QLabel
*labeldot1_;
    QLabel
*labeldot2_;    
    QLabel
*labeldot3_;
};

// MyIpAddrEdit.cpp
#include "MyIpAddrEdit.h"
#include
<QRegExpValidator>
#include
<QLabel>
#include
"MyIpPartLineEdit.h"

MyIpAddrEdit::MyIpAddrEdit(QWidget
* pParent /* = 0 */)
: QWidget(pParent)
{
    ip_part1_
= new MyIpPartLineEdit(this);
    ip_part2_
= new MyIpPartLineEdit(this);
    ip_part3_
= new MyIpPartLineEdit(this);
    ip_part4_
= new MyIpPartLineEdit(this);

    labeldot1_
= new QLabel(this);
    labeldot2_
= new QLabel(this);
    labeldot3_
= new QLabel(this);

    ip_part1_
->setGeometry(QRect(0, 0, 30, 20));
    ip_part2_
->setGeometry(QRect(30, 0, 30, 20));
    ip_part3_
->setGeometry(QRect(60, 0, 30, 20));
    ip_part4_
->setGeometry(QRect(90, 0, 30, 20));

    labeldot1_
->setText(" .");
    labeldot1_
->setGeometry(QRect(27, 1, 6, 18));
    labeldot1_
->setAlignment(Qt::AlignCenter);

    labeldot2_
->setText(" .");
    labeldot2_
->setGeometry(QRect(57, 1, 6, 18));
    labeldot2_
->setAlignment(Qt::AlignCenter);

    labeldot3_
->setText(" .");
    labeldot3_
->setGeometry(QRect(87, 1, 6, 18));
    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_);


    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&)));
    
}

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();

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

void MyIpAddrEdit::setStyleSheet(const QString &styleSheet)
{
    ip_part1_
->setStyleSheet(styleSheet);
    ip_part2_
->setStyleSheet(styleSheet);
    ip_part3_
->setStyleSheet(styleSheet);
    ip_part4_
->setStyleSheet(styleSheet);
}

 

#include <QApplication>
#include <QDialog>
#include "MyIpAddrEdit.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyIpAddrEdit *ipAddr = new MyIpAddrEdit();
    ipAddr->settext("127.0.0.1");
    ipAddr->show();

    return app.exec();
}

posted on 2011-06-27 10:58  katago  阅读(7158)  评论(0编辑  收藏  举报