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

你可能感兴趣的:(widget)