zoukankan      html  css  js  c++  java
  • 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();
    }

  • 相关阅读:
    2015 多校联赛 ——HDU5389(dp)
    spring MVC配置详解
    面试题整理11
    面试题整理09
    Spring和SpringMVC的区别
    SpringMVC01
    js中typeof与instanceof用法小记
    Java 可变参数
    log4j文件的配置
    Hibernate 分组查询 子查询 原生SQL
  • 原文地址:https://www.cnblogs.com/cute/p/2091168.html
Copyright © 2011-2022 走看看