qlineedit只能输入数字_Qt开源作品17-IP地址输入控件

## 一、前言

这个IP地址输入框控件,估计写烂了,网上随便一搜索,保证一大堆,估计也是因为这个控件太容易了,非常适合新手练手,一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式过滤只能输入3位数字,然后安装事件过滤器识别回车自动跳到下一个输入框。关于如何设置正则表达式过滤,这个可以搜索查到,本人也不大懂这个规则,貌似还有专门的书籍专门介绍正则表达式,可能这块非常强大。

主要功能:

1. 可设置IP地址,自动填入框

2. 可清空IP地址

3. 支持按下小圆点自动切换

4. 支持退格键自动切换

5. 支持IP地址过滤

6. 可设置背景色/边框颜色/边框圆角角度

## 二、代码思路

IPAddress::IPAddress(QWidget *parent) : QWidget(parent){    bgColor = "#FFFFFF";    borderColor = "#A6B5B8";    borderRadius = 3;    //用于显示小圆点的标签,居中对齐    labDot1 = new QLabel;    labDot1->setAlignment(Qt::AlignCenter);    labDot1->setText(".");    labDot2 = new QLabel;    labDot2->setAlignment(Qt::AlignCenter);    labDot2->setText(".");    labDot3 = new QLabel;    labDot3->setAlignment(Qt::AlignCenter);    labDot3->setText(".");    //用于输入IP地址的文本框,居中对齐    txtIP1 = new QLineEdit;    txtIP1->setObjectName("txtIP1");    txtIP1->setAlignment(Qt::AlignCenter);    txtIP1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    connect(txtIP1, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));    txtIP2 = new QLineEdit;    txtIP2->setObjectName("txtIP2");    txtIP2->setAlignment(Qt::AlignCenter);    txtIP2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    connect(txtIP2, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));    txtIP3 = new QLineEdit;    txtIP3->setObjectName("txtIP3");    txtIP3->setAlignment(Qt::AlignCenter);    txtIP3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    connect(txtIP3, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));    txtIP4 = new QLineEdit;    txtIP4->setObjectName("txtIP4");    txtIP4->setAlignment(Qt::AlignCenter);    txtIP4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    connect(txtIP4, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));    //设置IP地址校验过滤    QRegExp regExp("(2[0-5]{2}|2[0-4][0-9]|1?[0-9]{1,2})");    QRegExpValidator *validator = new QRegExpValidator(regExp, this);    txtIP1->setValidator(validator);    txtIP2->setValidator(validator);    txtIP3->setValidator(validator);    txtIP4->setValidator(validator);    //绑定事件过滤器,识别键盘按下    txtIP1->installEventFilter(this);    txtIP2->installEventFilter(this);    txtIP3->installEventFilter(this);    txtIP4->installEventFilter(this);    QFrame *frame = new QFrame;    frame->setObjectName("frameIP");    QStringList qss;    qss.append(QString("QFrame#frameIP{border:1px solid %1;border-radius:%2px;}").arg(borderColor).arg(borderRadius));    qss.append(QString("QLabel{min-width:15px;background-color:%1;}").arg(bgColor));    qss.append(QString("QLineEdit{background-color:%1;border:none;}").arg(bgColor));    qss.append(QString("QLineEdit#txtIP1{border-top-left-radius:%1px;border-bottom-left-radius:%1px;}").arg(borderRadius));    qss.append(QString("QLineEdit#txtIP4{border-top-right-radius:%1px;border-bottom-right-radius:%1px;}").arg(borderRadius));    frame->setStyleSheet(qss.join(""));    QVBoxLayout *verticalLayout = new QVBoxLayout(this);    verticalLayout->setMargin(0);    verticalLayout->setSpacing(0);    verticalLayout->addWidget(frame);    //将控件按照横向布局排列    QHBoxLayout *layout = new QHBoxLayout(frame);    layout->setMargin(0);    layout->setSpacing(0);    layout->addWidget(txtIP1);    layout->addWidget(labDot1);    layout->addWidget(txtIP2);    layout->addWidget(labDot2);    layout->addWidget(txtIP3);    layout->addWidget(labDot3);    layout->addWidget(txtIP4);}bool IPAddress::eventFilter(QObject *watched, QEvent *event){    if (event->type() == QEvent::KeyPress) {        QLineEdit *txt = (QLineEdit *)watched;        if (txt == txtIP1 || txt == txtIP2 || txt == txtIP3 || txt == txtIP4) {            QKeyEvent *key = (QKeyEvent *)event;            //如果当前按下了小数点则移动焦点到下一个输入框            if (key->text() == ".") {                this->focusNextChild();            }            //如果按下了退格键并且当前文本框已经没有了内容则焦点往前移            if (key->key() == Qt::Key_Backspace) {                if (txt->text().length() <= 1) {                    this->focusNextPrevChild(false);                }            }        }    }    return QWidget::eventFilter(watched, event);}

## 三、效果图

3444f05ce446db30c842537a916566bb.gif

## 四、开源主页

**以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。**

1. 国内站点:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)

2. 国际站点:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

3. 个人主页:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)

4. 知乎主页:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值