现在的位置: 首页 > 综合 > 正文

QT中封装的IP地址的widget

2013年06月05日 ⁄ 综合 ⁄ 共 7700字 ⁄ 字号 评论关闭
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();
}

抱歉!评论已关闭.