QT ip控件的编写

#ifndef IPPARTLINEEDIT_H
#define IPPARTLINEEDIT_H

#include <QLineEdit>

class QWidget;
class QFocusEvent;
class QKeyEvent;

class IpPartLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    IpPartLineEdit(QWidget *parent = 0);
    ~IpPartLineEdit(void);
    void set_prevtab_edit(IpPartLineEdit *prevtab) { prev_tab = prevtab; }
    void set_nexttab_edit(IpPartLineEdit *nexttab) { next_tab = nexttab; }
private:
    IpPartLineEdit *prev_tab;
    IpPartLineEdit *next_tab;
protected:
    virtual void focusInEvent(QFocusEvent *e);
    virtual void keyPressEvent(QKeyEvent *event);
private slots:
    void text_edited(const QString& text);
};

#endif // IPPARTLINEEDIT_H
#include "ippartlineedit.h"
#include <QIntValidator>
#include <QKeyEvent>
#include <QWidget>
#include <QFocusEvent>
#include <QKeyEvent>
#include <QDebug>
IpPartLineEdit::IpPartLineEdit(QWidget *parent/* = 0*/)
    : QLineEdit(parent)
{
    //下一个
    prev_tab = NULL;
    //上一个
    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&)));
}

//析构函数
IpPartLineEdit::~IpPartLineEdit(void)
{
}


//焦点函数
void IpPartLineEdit::focusInEvent(QFocusEvent *e)
{
    this->selectAll();
    QLineEdit::focusInEvent(e);
}

//按键处理函数
void IpPartLineEdit::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Period)
    {
        QString current_tab = this->text();
        if (next_tab&& (!current_tab.isEmpty()))
        {
            next_tab->setFocus();
            next_tab->selectAll();
        }
    }
    else if (event->key() == Qt::Key_Backspace)
    {
        QString current_tab = this->text();
        if (prev_tab&& (current_tab.isEmpty()))
        {
            prev_tab->setFocus();
            prev_tab->selectAll();
        }
    }
    else if (event->key() == Qt::Key_Left)
    {
        int index = cursorPosition();
        QString current_tab = this->text();
        if(index==0)
        {
            if (prev_tab&& (!current_tab.isEmpty()))
            {
                prev_tab->setFocus();
                prev_tab->selectAll();
            }
        }
    }
    else if (event->key() == Qt::Key_Right)
    {
        QString current_tab = this->text();
        if (cursorPosition() == current_tab.length())
        {
            if (next_tab&& (!current_tab.isEmpty()))
            {
                next_tab->setFocus();
                next_tab->selectAll();
            }
        }
    }


    QLineEdit::keyPressEvent(event);
}

//输入编译函数
void IpPartLineEdit::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();
                }
            }
        }
    }
}
#ifndef IPADDRLINEEDIT_H
#define IPADDRLINEEDIT_H

#include <QWidget>

class IpPartLineEdit;
class QLabel;
class QLineEdit;

class IpAddrLineEdit : public QWidget
{
    Q_OBJECT
public:
    explicit IpAddrLineEdit(QWidget *parent = nullptr);
    ~IpAddrLineEdit();
    void setMaxMinHeight(int height);
    bool isIPaddress(QString ip);
    void settext(const QString &text);
    QString text();
    void getIp(QString& ip1, QString& ip2, QString& ip3, QString& ip4);
    void resizeEvent(QResizeEvent *event);
private:
    IpPartLineEdit *ip_part1;
    IpPartLineEdit *ip_part2;
    IpPartLineEdit *ip_part3;
    IpPartLineEdit *ip_part4;
    QLabel *labeldot1;
    QLabel *labeldot2;
    QLabel *labeldot3;
signals:
    void textchanged(const QString& text);
    void textedited(const QString &text);
private slots:
    void textchangedslot(const QString& text);
    void texteditedslot(const QString &text);
};

#endif // IPADDRLINEEDIT_H
#include "ipaddrlineedit.h"
#include "ippartlineedit.h"
#include <QRegExpValidator>
#include <QLabel>
#include <QHBoxLayout>
#include <QMessageBox>
#include <QStringList>
#include <QLineEdit>
IpAddrLineEdit::IpAddrLineEdit(QWidget *parent) : QWidget(parent)
{
    QFont font(".萍方-简", 10);
    ip_part1 = new IpPartLineEdit(this);
    ip_part2 = new IpPartLineEdit(this);
    ip_part3 = new IpPartLineEdit(this);
    ip_part4 = new IpPartLineEdit(this);

    labeldot1 = new QLabel();
    labeldot2 = new QLabel();
    labeldot3 = new QLabel();

    ip_part1->setFont(font);
    ip_part2->setFont(font);
    ip_part3->setFont(font);
    ip_part4->setFont(font);

    labeldot1->setText(".");
    labeldot1->setFont(font);
    labeldot1->setAlignment(Qt::AlignCenter);
    labeldot1->setStyleSheet("background-color: rgb(255, 255, 255)");

    labeldot2->setText(".");
    labeldot2->setFont(font);
    labeldot2->setAlignment(Qt::AlignCenter);
    labeldot2->setStyleSheet("background-color: rgb(255, 255, 255)");

    labeldot3->setText(".");
    labeldot3->setFont(font);
    labeldot3->setAlignment(Qt::AlignCenter);
    labeldot3->setStyleSheet("background-color: rgb(255, 255, 255)");

    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_prevtab_edit(ip_part1);
    ip_part3->set_prevtab_edit(ip_part2);
    ip_part4->set_prevtab_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&)));

}

//设置对话框高度
void IpAddrLineEdit::setMaxMinHeight(int height)
{
    ip_part1->setMaximumHeight(height);ip_part1->setMinimumHeight(height);
    ip_part2->setMaximumHeight(height);ip_part2->setMinimumHeight(height);
    ip_part3->setMaximumHeight(height);ip_part3->setMinimumHeight(height);
    ip_part4->setMaximumHeight(height);ip_part4->setMinimumHeight(height);
    labeldot1->setMaximumHeight(height);labeldot1->setMinimumHeight(height);
    labeldot2->setMaximumHeight(height);labeldot2->setMinimumHeight(height);
    labeldot3->setMaximumHeight(height);labeldot3->setMinimumHeight(height);
    QHBoxLayout *layout = new QHBoxLayout(this);
    layout->setMargin(0);
    layout->setSpacing(0);
    layout->addWidget(ip_part1);
    layout->addWidget(labeldot1);
    layout->addWidget(ip_part2);
    layout->addWidget(labeldot2);
    layout->addWidget(ip_part3);
    layout->addWidget(labeldot3);
    layout->addWidget(ip_part4);
    layout->setStretch(0,10);
    layout->setStretch(1,1);
    layout->setStretch(2,10);
    layout->setStretch(3,1);
    layout->setStretch(4,10);
    layout->setStretch(5,1);
    layout->setStretch(6,10);
}

//更改IP对话框大小
void IpAddrLineEdit::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);
    setMaxMinHeight(height());
}

//析构函数
IpAddrLineEdit::~IpAddrLineEdit()
{

}

//内容改变
void IpAddrLineEdit::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 IpAddrLineEdit::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);
}

//判断IP是否可用
bool IpAddrLineEdit::isIPaddress(QString text)
{
    QString qstring_validate = text;
    QStringList ippart = qstring_validate.split(".");
    if(ippart.size()!=4)
    {
        QMessageBox::information(this, "友情提示", "设置的ip地址\n格式错误");
        return false;
    }
    int data=0;
    QString str;
    for(int i=0;i<4;i++)
    {
        str=ippart.at(i);
        data=str.toInt();
        if(data<0||data>255)
        {
            QMessageBox::information(this, "友情提示", "设置的ip地址\n格式错误");
            return false;
        }
    }
    return true;
}

//设置IP
void IpAddrLineEdit::settext(const QString &text)
{
    if(isIPaddress(text))
    {
        QString qstring_validate = text;
        QStringList ippart = qstring_validate.split(".");
        ip_part1->setText(ippart.at(0));
        ip_part2->setText(ippart.at(1));
        ip_part3->setText(ippart.at(2));
        ip_part4->setText(ippart.at(3));
    }
}

//得到控件IP
QString IpAddrLineEdit::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);
}

//得到IP对应的数字
void IpAddrLineEdit::getIp(QString& ip1, QString& ip2, QString& ip3, QString& ip4)
{
    ip1 = ip_part1->text();
    ip2 = ip_part2->text();
    ip3 = ip_part3->text();
    ip4 = ip_part4->text();
}

提升

应用

ui->widget->settext("192.168.0.234");

效果

参考博文:https://www.cnblogs.com/simpleCY/articles/11848584.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值