本文章所用的代码整理自https://blog.csdn.net/u011417605/article/details/51353337,感谢原作者分享

本代码在上述作者代码基础上做了如下修改:

(1)屏蔽中文输入法

(2)修复原作者代码中输入框四周的黑色边线无法正常显示的问题

(3)添加类似windows的IP输入框中输入黑点后自动选中下一区段的特性

(4)修复原作者代码中读取的IP字符串没有添加黑点的问题

主要代码如下:

#include "qiplineedit.h"
#include <QApplication>
#include <QWidget>
#include <QLabel>int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;w.resize(300, 150);QIPLineEdit *ipEdit=new QIPLineEdit(&w);ipEdit->setGeometry(50, 20, 200, 50);ipEdit->setText("192.168.11.110");QLabel *ipLabel=new QLabel(&w);ipLabel->move(50, 90);ipLabel->setText(QString("IP is: %1").arg(ipEdit->text()));w.show();return a.exec();
}
#ifndef QIPLINEEDIT_H
#define QIPLINEEDIT_H#include <QLineEdit>
#include <QEvent>class QIPLineEdit : public QLineEdit
{Q_OBJECTpublic:QIPLineEdit(QWidget *parent = 0);~QIPLineEdit();void setText(const QString &strIP);QString text() const;
protected:void paintEvent(QPaintEvent *event);bool eventFilter(QObject *obj, QEvent *ev);int getIndex(QLineEdit *pEdit);bool isTextValid(const QString &strIP);
private:QLineEdit *m_lineEidt[4];
};#endif // QIPLINEEDIT_H
#include "qiplineedit.h"
#include <QRegExpValidator>
#include <QPainter>
#include <QHBoxLayout>
#include <QKeyEvent>
#include <QMessageBox>
#include <QDebug>QIPLineEdit::QIPLineEdit(QWidget *parent): QLineEdit(parent)
{QRegExp regx("(2[0-5]{2}|2[0-4][0-9]|1?[0-9]{1,2})"); //只能输入IPQHBoxLayout *pHBox = new QHBoxLayout(this);pHBox->setSpacing(10);pHBox->setContentsMargins(2, 2, 2, 2);  //不能设置为全0,否则四周的黑色边框无法正常显示for (int i = 0; i < 4; i++){m_lineEidt[i] = new QLineEdit(this);m_lineEidt[i]->setFrame(false);m_lineEidt[i]->setMaxLength(3);m_lineEidt[i]->setAlignment(Qt::AlignCenter);m_lineEidt[i]->installEventFilter(this);m_lineEidt[i]->setAttribute(Qt::WA_InputMethodEnabled, false); //屏蔽中文输入法干扰QRegExpValidator *validator = new QRegExpValidator(regx, m_lineEidt[i]);m_lineEidt[i]->setValidator(validator);m_lineEidt[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);pHBox->addWidget(m_lineEidt[i]);}this->setReadOnly(true);
}QIPLineEdit::~QIPLineEdit()
{}void QIPLineEdit::paintEvent(QPaintEvent *event)
{QLineEdit::paintEvent(event);QPainter painter(this);QBrush brush;brush.setStyle(Qt::BrushStyle::SolidPattern);brush.setColor(Qt::black);painter.setBrush(brush);int width = 0;for (int i = 0; i < 3; i++){width += m_lineEidt[i]->width() + (i == 0 ? 3 : 10);//布局的间隔painter.drawEllipse(width, height() / 2 - 2, 4, 4);}
}int QIPLineEdit::getIndex(QLineEdit *pEdit)
{int index = -1;for (int i = 0; i < 4; i++){if (pEdit == m_lineEidt[i])index = i;}return index;
}bool QIPLineEdit::eventFilter(QObject *obj, QEvent *ev)
{if (children().contains(obj) && QEvent::KeyPress == ev->type()){QKeyEvent *keyEvent = dynamic_cast<QKeyEvent *>(ev);QLineEdit *pEdit = qobject_cast<QLineEdit *>(obj);switch (keyEvent->key()){case Qt::Key_0:case Qt::Key_1:case Qt::Key_2:case Qt::Key_3:case Qt::Key_4:case Qt::Key_5:case Qt::Key_6:case Qt::Key_7:case Qt::Key_8:case Qt::Key_9:{QString strText = pEdit->text();if (pEdit->selectedText().length()){pEdit->text().replace(pEdit->selectedText(), QChar(keyEvent->key()));}else if (strText.length() == 3 || strText.length() < 3 && strText.toInt() * 10 > 255){int index = getIndex(pEdit);if (index != -1 && index != 3){m_lineEidt[index + 1]->setFocus();m_lineEidt[index + 1]->selectAll();}}else if (strText.length() == 2 && strText.toInt() * 10 < 255){if (Qt::Key_0 == keyEvent->key() && strText.toInt()){pEdit->setText(strText.insert(pEdit->cursorPosition(), QChar(Qt::Key_0)));}}return QLineEdit::eventFilter(obj, ev);}break;case Qt::Key_Backspace:{QString strText = pEdit->text();if (!strText.length() || strText.length() && !pEdit->cursorPosition()){int index = getIndex(pEdit);if (index != -1 && index != 0){m_lineEidt[index - 1]->setFocus();int length = m_lineEidt[index - 1]->text().length();m_lineEidt[index - 1]->setCursorPosition(length ? length : 0);}}return QLineEdit::eventFilter(obj, ev);}case Qt::Key_Left:{if (!pEdit->cursorPosition()){int index = getIndex(pEdit);if (index != -1 && index != 0){m_lineEidt[index - 1]->setFocus();int length = m_lineEidt[index - 1]->text().length();m_lineEidt[index - 1]->setCursorPosition(length ? length : 0);}}return QLineEdit::eventFilter(obj, ev);}case Qt::Key_Right:{if (pEdit->cursorPosition() == pEdit->text().length()){int index = getIndex(pEdit);if (index != -1 && index != 3){m_lineEidt[index + 1]->setFocus();m_lineEidt[index + 1]->setCursorPosition(0);}}return QLineEdit::eventFilter(obj, ev);}case Qt::Key_Period:  //小数点{if (pEdit->cursorPosition() == pEdit->text().length()){int index = getIndex(pEdit);if (index != -1 && index != 3){m_lineEidt[index + 1]->setFocus();m_lineEidt[index + 1]->setCursorPosition(0);m_lineEidt[index + 1]->selectAll();}}return QLineEdit::eventFilter(obj, ev);}default:break;}}return false;
}void QIPLineEdit::setText(const QString &strIP)
{if (!isTextValid(strIP)){return;}else{QStringList ipList = strIP.split(".");for(int i=0; i<ipList.size(); i++){QString ip=ipList.at(i);m_lineEidt[i]->setText(ip);}}
}bool QIPLineEdit::isTextValid(const QString &strIP)
{QRegExp rx2("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");if (!rx2.exactMatch(strIP))return false;return true;
}QString QIPLineEdit::text() const
{QString strIP;for (int i = 0; i < 4; i++){if(i>0){strIP.append(".");}strIP.append(m_lineEidt[i]->text());}return strIP;
}

运行效果:

Qt实现IP输入框(模仿Windows系统中的IP输入框)相关推荐

  1. Windows系统中当IP改变时给指定邮箱发通知邮件

    我们使用批处理实现当IP改变时给指定邮箱发邮件. 首先必须安装blat软件. @echo off ipconfig | find "IPv4" > wuxiao2.txt e ...

  2. ip设置 kali 重置_在 Windows 系统中如何重置 TCP/IP 协议堆栈修复网络连接问题

    Internet 在 TCP/IP 协议上工作,如果 TCP/IP 协议堆栈在 Windows 或任何其他操作系统(例如 Linux 或 MacOS)中无法正常工作,则您的 Internet 连接会出 ...

  3. 在windows系统和linux系统中查询IP地址命令的不同

    在linux和windows系统上查询IP地址的命令是不一样的.         在linux中的命令行模式下,输入ifconfig即可查询到IP.而在windows系统下要查询IP地址需要先打开do ...

  4. linux查看Windows的ip命令,在windows系统和linux系统中查询IP地址命令的不同

    在linux和windows系统上查询IP地址的命令是不一样的. 在linux中的命令行模式下,输入ifconfig即可查询到IP.而在windows系统下要查询IP地址需要先打开dos命令行,然后输 ...

  5. Linux / Windows系统中安装最新版 ElasticSearch (es)搜索引擎 超详细图文教程【一看就懂】

    "You Know, for Search"  相信来到这里的朋友们已经对ElasticSearch(es)有了一个大致的了解.关于Elasticsearch的介绍就不在此做过多赘 ...

  6. 调用mstsc命令_在Windows系统中,打开远程桌面的命令是(mstsc)

    ghost win7系统用户反映不知道怎么使用Windows远程桌面命令,还有打开远程桌面的命令之后的使用.下面小编就来详细介绍一下通过Windows计算机的远程桌面连接来管理远程计算机和入侵渗透测试 ...

  7. 系统首选dns服务器修改,如何在Windows系统中设置首选DNS

    有时候可能需要修改或者调整 DNS 服务器地址的设置,以达到优化网络连接速度的效果.那么如何在Windows系统中设置首选DNS呢?具体请看下面学习啦小编介绍的操作方法! 在Windows系统中设置首 ...

  8. P7 - Windows系统中DNS服务 之 ipconfig命令

    [软考-软件设计师-历年真题-2012年下半年上午基础知识] 如果DNS服务器更新了某域名的IP地址,造成客户端域名解析故障,在客户端可以用两种方法解决此问题,其中一种是在Windows命令行下执行( ...

  9. windows系统中,在当前目录下打开cmd命令行的两种方法

    windows系统中,在当前目录下打开cmd命令行的两种方法 1.在当前路径地址栏中直接输入'cmd',然后回车. 2.在当前路径下,按住'shift'键同时点击鼠标右键,点击"在此处打开P ...

最新文章

  1. 【原】Java学习笔记020 - 面向对象
  2. 一学即懂得计算机视觉
  3. 系统调用003 系统服务表
  4. 苹果6s强制删除id锁_苹果手机丢了怎么找回?
  5. 牛年喜庆红色字体标题PSD素材!
  6. Python学习_4_if_while_for
  7. 敏捷开发绩效管理之七:敏捷开发生产率(下)(简化功能点分析,NESMA,两级简化)...
  8. 了解FPS屏幕刷新率
  9. Android应用开发提高篇(1)-----获取本地IP
  10. 虚拟服务器ftp文件权限修改,虚拟主机用户ftp和apache用户文件互操作权限解决方法...
  11. 一步步学习微软InfoPath2010和SP2010--第十二章节--管理和监控InfoPath Form Services(IPFS)(3)--安装Fiddler并监控IPFS表单加载过程
  12. jboss下载及安装
  13. MEPR500+电子护照阅读器|识读模块嵌入式安装与应用说明
  14. mysql从创库到查询基本命令
  15. 互联网络业的十大发展趋势
  16. 【前端面试】Part 1:2020届初级前端校招笔试题及面经总结 —— 基础知识题
  17. windows家族介绍
  18. JavaWeb开发网上商城
  19. 网页聊天室的开发笔记
  20. Mac电脑用预览功能调整图像大小?Mac调整图片大小方法

热门文章

  1. php 获取a-z中随机_PHP中的随机性-您感到幸运吗?
  2. 瑞士洛桑联邦理工学院:研究显示用我们的身体和动作操纵无人机比摇杆更适合...
  3. SCO OpenServer 5.0.7安装心得
  4. TrackingMore API C# 调用示例
  5. MHP 对象轮播HTML应用解析与实现
  6. 云栖专辑 | 阿里开发者们的20个感悟,一通百通 1
  7. 深度学习图像处理目标检测图像分割计算机视觉 07--图像检索
  8. 编程表达年月日分秒c语言,年月日时分秒教学反思
  9. 数学分析(2):自然数集的构建
  10. 下一代IC芯片卡将加密提升安全性能