说明

qt编写的ip地址输入控件,功能齐全,非常实用,使用提升法集成到自己项目的ui中即可。提供设置ip和获取ip两个接口。具体看代码,比较简单,注释应该比较详细了,下载地址放在文章尾部。

代码

ipinputcontrol.h

#ifndef IPINPUTCONTROL_H
#define IPINPUTCONTROL_H#include <QWidget>
#include <QKeyEvent>
#include <QRegExpValidator>QT_BEGIN_NAMESPACE
namespace Ui { class ipInputControl; }
QT_END_NAMESPACEclass ipInputControl : public QWidget
{Q_OBJECTpublic:ipInputControl(QWidget *parent = nullptr);~ipInputControl();
signals:void warningIP(const QString&);
public slots:QString getIP() const;void setIP(const QString&);
private:void keyPressEvent(QKeyEvent*);bool eventFilter(QObject*, QEvent*);void checkInput(const QString&);
private:Ui::ipInputControl *ui;
};
#endif // IPINPUTCONTROL_H

ipinputcontrol.cpp

#include "ipinputcontrol.h"
#include "ui_ipinputcontrol.h"
#include <QDebug>
#define outlog qDebug()
ipInputControl::ipInputControl(QWidget *parent): QWidget(parent), ui(new Ui::ipInputControl)
{ui->setupUi(this);//设置IP地址校验,禁止输入非法字符QRegExp regExp("(2[0-5]{2}|2[0-4][0-9]|1?[0-9]{1,2})");QRegExpValidator *validator = new QRegExpValidator(regExp, this);ui->lineEdit->setValidator(validator);ui->lineEdit_2->setValidator(validator);ui->lineEdit_3->setValidator(validator);ui->lineEdit_4->setValidator(validator);//设置Tab键按下时的切换顺序QWidget::setTabOrder(ui->lineEdit, ui->lineEdit_2);QWidget::setTabOrder(ui->lineEdit_2, ui->lineEdit_3);QWidget::setTabOrder(ui->lineEdit_3, ui->lineEdit_4);QWidget::setTabOrder(ui->lineEdit_4, ui->lineEdit);//在窗体上为lineEdit安装事件过滤器ui->lineEdit->installEventFilter(this);ui->lineEdit_2->installEventFilter(this);ui->lineEdit_3->installEventFilter(this);ui->lineEdit_4->installEventFilter(this);//输入时做检查connect(ui->lineEdit, &QLineEdit::textChanged, this, &ipInputControl::checkInput);connect(ui->lineEdit_2, &QLineEdit::textChanged, this, &ipInputControl::checkInput);connect(ui->lineEdit_3, &QLineEdit::textChanged, this, &ipInputControl::checkInput);connect(ui->lineEdit_4, &QLineEdit::textChanged, this, &ipInputControl::checkInput);
}ipInputControl::~ipInputControl()
{delete ui;
}//检查ip地址输入,若输入超过2位或2位数值大于25时,发送事件自动切换到下一个输入口
void ipInputControl::checkInput(const QString& text)
{if(ui->lineEdit_4->hasFocus()){return ;}if(text.length() > 2){QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);qApp->sendEvent(this, &myEvent);}else if(text.length() == 2){int temp = text.toInt();if(temp > 25){QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);qApp->sendEvent(this, &myEvent);}}
}
//回车键可以对输入做检查
void ipInputControl::keyPressEvent(QKeyEvent* e)
{if(e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return){QString ipSub1 = ui->lineEdit->text();QString ipSub2 = ui->lineEdit_2->text();QString ipSub3 = ui->lineEdit_3->text();QString ipSub4 = ui->lineEdit_4->text();if(ipSub1.isEmpty() || ipSub2.isEmpty() || ipSub3.isEmpty() || ipSub4.isEmpty()){emit warningIP("ip address input error.");outlog<<"ip address input is error.";}else{QString ipString = ipSub1 + "." + ipSub2 + "." + ipSub3 + "." + ipSub4;outlog << "ipString: " << ipString;}}
}
bool ipInputControl::eventFilter(QObject *watched, QEvent *event)
{if (event->type() == QEvent::KeyPress){QLineEdit *txt = (QLineEdit *)watched;if (txt == ui->lineEdit || txt == ui->lineEdit_2 || txt == ui->lineEdit_3 || txt == ui->lineEdit_4){QKeyEvent *key = (QKeyEvent *)event;//如果当前按下了小数点则移动焦点到下一个输入框if (key->text() == "."){if(ui->lineEdit->hasFocus())ui->lineEdit_2->setFocus();else if(ui->lineEdit_2->hasFocus())ui->lineEdit_3->setFocus();else if(ui->lineEdit_3->hasFocus())ui->lineEdit_4->setFocus();else if(ui->lineEdit_4->hasFocus())ui->lineEdit->setFocus();}//如果按下了退格键并且当前文本框已经没有了内容则焦点往前移if (key->key() == Qt::Key_Backspace){if (txt->text().length() <= 1){if(ui->lineEdit_2->hasFocus())ui->lineEdit->setFocus();else if(ui->lineEdit_3->hasFocus())ui->lineEdit_2->setFocus();else if(ui->lineEdit_4->hasFocus())ui->lineEdit_3->setFocus();}}}}return QWidget::eventFilter(watched, event);
}
//返回ip地址字符串,用于获取
QString ipInputControl::getIP() const
{QString ipSub1 = ui->lineEdit->text();QString ipSub2 = ui->lineEdit_2->text();QString ipSub3 = ui->lineEdit_3->text();QString ipSub4 = ui->lineEdit_4->text();if(ipSub1.isEmpty() || ipSub2.isEmpty() || ipSub3.isEmpty() || ipSub4.isEmpty()){return "";}return ipSub1 + "." + ipSub2 + "." + ipSub3 + "." + ipSub4;;
}
//从ip地址字符串设置到ui
void ipInputControl::setIP(const QString& text)
{QStringList ipList = text.split(".");if(ipList.size() != 4){emit warningIP("ip address format is error.");outlog<<"ip address format is error.";return;}ui->lineEdit->setText(ipList.at(0));ui->lineEdit_2->setText(ipList.at(1));ui->lineEdit_3->setText(ipList.at(2));ui->lineEdit_4->setText(ipList.at(3));
}

下载地址

基于qt平台的ip地址输入控件相关推荐

  1. WPF IP地址输入控件的实现

    WPF IP地址输入控件的实现 原文:WPF IP地址输入控件的实现 一.前言 WPF没有内置IP地址输入控件,因此我们需要通过自己定义实现. 我们先看一下IP地址输入控件有什么特性: 输满三个数字焦 ...

  2. qt显示rgba8888 如何改 frame_Qt开源作品17-IP地址输入控件

    一.前言 这个IP地址输入框控件,估计写烂了,网上随便一搜索,保证一大堆,估计也是因为这个控件太容易了,非常适合新手练手,一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式 ...

  3. 【Elasticsearch】基于 Elasticsearch + kibana 实现 IP 地址分布地图可视化

    1.概述 转载:基于 Elasticsearch + kibana 实现 IP 地址分布地图可视化 1.需求 有一批特定用途(文末揭晓)的 IP 地址. 想通过地图形式可视化展示 IP 地址对应的经纬 ...

  4. 超详细基于Qt平台实现C/C++调用Matlab函数全流程

    超详细基于Qt平台实现C/C++调用Matlab函数全流程 1. 基本调用方式介绍 2. 环境配置 3. 将Matlab程序写成函数形式 4. Matlab配置C编译器,将.m文件转换成动态链接库 4 ...

  5. php 本地mysql 代码_基于本地数据库的 IP 地址查询 PHP 源码

    * 纯真 IP 数据库查询 * * 参考资料: * - 纯真 IP 数据库 http://www.cz88.net/ip/ * - PHP 读取纯真IP地址数据库 http://ju.outofmem ...

  6. [html] 怎样去除iOS和Android中的输入URL地址的控件条呢?

    [html] 怎样去除iOS和Android中的输入URL地址的控件条呢? setTimeout(scrollTo,0,0,0); 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚 ...

  7. 基于Qt平台开发安卓应用

    基于Qt平台开发安卓应用 在之前的Qt学习中,使用QtGUI来实现简单的界面与后台功能设计.这样开发出来的应用往往界面元素比较单一,美感几乎可以省略,与其他移动平台开发的App相比,确实逊色不少.基于 ...

  8. 基于Qt平台的集串口调试助手、示波器、图像显示功能于一体的上位机。

    基于Qt平台的集串口调试助手.示波器.图像显示功能于一体的上位机. 可用的上位机及通信协议可在这里下载,通信协议可以很方便的移植到stm32上 链接:https://pan.baidu.com/s/1 ...

  9. QT中常用的输入控件

    Qt Creator有15种Input Widgets,如下图:     Input Widgets的Qt类和名称介绍如下表 控件类     控件名     中文名     控件类     控件名   ...

  10. PyQt5 基本语法(四):输入控件

    文章目录 2. 输入控件(一) 2.1 纯键盘 2.1.1 QLineEdit 2.1.1.1 描述 2.1.1.2 控件创建 2.1.1.3 输出模式 2.1.1.4 提示字符串 2.1.1.5 清 ...

最新文章

  1. 银联配置 linux 路径,深圳银联POS支付系统安装手册(LinuxMySQL).doc
  2. 3D Robotics转型新动作,将为亚特兰大机场提供站点扫描服务
  3. SystemCenter2012SP1实践(16)私有云的第一个模板
  4. SetProcessWorkingSetSize 降低程序运行内存
  5. golang sync.Map 使用
  6. 每一个项目都可以有一个项目blog page
  7. 关于Integer.MAX_VALUE + 1 = Integer.MIN_VALUE 问题
  8. 向量时钟Vector Clock in Riak
  9. android cmake 打印_Android使用CMAKE编译libjpeg
  10. zookeeper安装和使用 windows环境
  11. Java常用设计模式————适配器模式
  12. Web Hacking 101 中文版 八、跨站请求伪造
  13. 桌面创建快捷方式 不显示图标
  14. springboot基于java的校园二手书籍交易平台毕业设计源码131558
  15. ArcGIS教程:基于ArcGIS的CAD数据向GIS数据转换方法
  16. 计算机硬件及冯诺伊曼结构
  17. iOS 多态和多继承
  18. 3分钟带你彻底弄懂数码管的段选与位选
  19. 计算机系统结构的分类-复杂指令集系统CISC与精简指令集系统RISC
  20. 【JavaWeb】客户关系管理系统

热门文章

  1. nas文件服务器权限安全,大势至局域网共享文件监控NAS文件权限设置的方法
  2. 系统动力学学习笔记一
  3. NRF24L01模块使用(老干妈笔记)
  4. 带你画uml系统用例图
  5. 空手套白狼,硬阅java字节码class文件
  6. 1501_FTA失效树分析简介
  7. quartz 定时任务 表达式
  8. 基于matlab的双闭环直流调速系统,基于MATLAB的双闭环直流调速系统建模与仿真.PDF...
  9. 元旦大礼,JavaScript第四版红宝书送20本!
  10. 医疗时鲜资讯:移动医疗 or 互联网医疗 or 远程医疗?