Qt实现IP地址输入框-自定义控件

       在 许多应用程序中,我们经常需要使用IP地址。为了方便用户输入和处理,一个好的解决方案是使用自定义控件。本示例代码使用Qt编写一个名为“IPAddress”的自定义控件来实现IP地址的输入功能。通过使用此控件,用户可以方便地输入和处理IP地址。

        IP地址输入框用于让用户输入一个有效的IP地址。IP地址是用来标识网络上的设备的一串数字,它由四个十进制数组成,每个数的取值范围是0到255。在网络应用中,IP地址输入框通常用于验证用户输入的IP地址是否合法,以及在需要连接到特定IP地址的情况下,让用户输入目标IP地址。

 一、简述

        这个IP地址输入框控件,估计写烂了,但本专栏是分享QT自定义控件,所以顺便分享一个该类型控件,供大家参考学习!

        在Qt中,可以通过自定义控件来实现IP地址输入框。IP地址输入框是一个特殊的输入框,它用来输入IPv4地址。

        自定义IP地址输入框控件可以包含四个文本输入框,用来输入四个IP地址的各个部分。

二、实现的功能
  • 1:可设置IP地址,自动填入框
  • 2:可清空IP地址
  • 3:支持按下小圆点自动切换
  • 4:支持退格键自动切换
  • 5:支持IP地址过滤
  • 6:可设置背景色/边框颜色/边框圆角角度
三、效果 

 

四、核心代码 

        一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式过滤只能输入3位数字,然后安装事件过滤器识别回车自动跳到下一个输入框 

头文件ipaddress.h 
#ifndef IPADDRESS_H
#define IPADDRESS_H#include <QWidget>class QLabel;
class QLineEdit;class IPAddress : public QWidget
{Q_OBJECTQ_PROPERTY(QString ip READ getIP WRITE setIP)public:explicit IPAddress(QWidget *parent = 0);public://获取IP地址QString getIP() const;QSize sizeHint() const;QSize minimumSizeHint() const;public slots://设置IP地址void setIP(const QString &ip);//清空void clear();//设置背景颜色void setBgColor(const QString &bgColor);//设置边框颜色void setBorderColor(const QString &borderColor);//设置边框圆角角度void setBorderRadius(int borderRadius);protected:bool eventFilter(QObject *watched, QEvent *event);private slots:void textChanged(const QString &text);private:QLabel *labDot1;    //第一个小圆点QLabel *labDot2;    //第二个小圆点QLabel *labDot3;    //第三个小圆点QLineEdit *txtIP1;  //IP地址网段输入框1QLineEdit *txtIP2;  //IP地址网段输入框2QLineEdit *txtIP3;  //IP地址网段输入框3QLineEdit *txtIP4;  //IP地址网段输入框4QString ip;         //IP地址QString bgColor;    //背景颜色QString borderColor;//边框颜色int borderRadius;   //边框圆角角度};#endif // IPADDRESS_H
 ipaddress.cpp文件
#include "ipaddress.h"
#include <QLabel>
#include <QLineedit>
#include <QBoxlayout>
#include <QRegexp>
#include <QValidator>
#include <QEvent>
#include <QKeyEvent>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地址校验过滤QString pattern = "(2[0-5]{2}|2[0-4][0-9]|1?[0-9]{1,2})";QRegExp regExp(pattern);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->setContentsMargins(0, 0, 0, 0);verticalLayout->setSpacing(0);verticalLayout->addWidget(frame);//将控件按照横向布局排列QHBoxLayout *layout = new QHBoxLayout(frame);layout->setContentsMargins(0, 0, 0, 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);
}void IPAddress::textChanged(const QString &text)
{int len = text.length();int value = text.toInt();//判断当前是否输入完成一个网段,是的话则自动移动到下一个输入框if (len == 3) {if (value >= 100 && value <= 255) {this->focusNextChild();}}//拼接成完整IP地址ip = QString("%1.%2.%3.%4").arg(txtIP1->text()).arg(txtIP2->text()).arg(txtIP3->text()).arg(txtIP4->text());
}QString IPAddress::getIP() const
{return this->ip;
}QSize IPAddress::sizeHint() const
{return QSize(250, 20);
}QSize IPAddress::minimumSizeHint() const
{return QSize(30, 10);
}void IPAddress::setIP(const QString &ip)
{//先检测IP地址是否合法QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");if (!regExp.exactMatch(ip)) {return;}if (this->ip != ip) {this->ip = ip;//将IP地址填入各个网段QStringList list = ip.split(".");txtIP1->setText(list.at(0));txtIP2->setText(list.at(1));txtIP3->setText(list.at(2));txtIP4->setText(list.at(3));}
}void IPAddress::clear()
{txtIP1->clear();txtIP2->clear();txtIP3->clear();txtIP4->clear();txtIP1->setFocus();
}void IPAddress::setBgColor(const QString &bgColor)
{if (this->bgColor != bgColor) {this->bgColor = bgColor;}
}void IPAddress::setBorderColor(const QString &borderColor)
{if (this->borderColor != borderColor) {this->borderColor = borderColor;}
}void IPAddress::setBorderRadius(int borderRadius)
{if (this->borderRadius != borderRadius) {this->borderRadius = borderRadius;}
}

        这样就实现了一个简单的IP地址输入框的自定义控件。可以根据自己的需求添加更多的功能。 如输入无效,我们可以发出警告并清除输入。通过自定义IP地址输入框控件,可以方便地集成到Qt项目中,提供用户友好的IP地址输入方式,避免用户输入错误的IP地址。

         谢谢您的阅读和支持。如果您还有任何问题或需要进一步的帮助,请随时与我联系。再次感谢,并祝您一切顺利!

五、源代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3245292.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程② | 5.4 - 5.8

前言 第 5 章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术的内容&#xff0c;学习要以教材为准。 目录 5.4 软件实现 5.4.1 软件配置管理 5.4.2 软件编码 5.4.3 软件测试 5.5 部署交付 5.5.1 软件部署 5.5.2 软件交付 5.5.3 持续交付 5.5.4…

全新升级!联想Windows 10 22H2专业版,一键下载!

联想Windows 10 22H2专业版系统适用于联想笔记本、台式机安装使用&#xff0c;全新优化升级&#xff0c;运作更流畅更稳定&#xff0c;丰富多样的系统功能&#xff0c;轻松满足用户日常学习、工作的使用需求。同时&#xff0c;该版本系统能够正常更新补丁&#xff0c;您也可以手…

useState函数

seState是一个react Hook(函数)&#xff0c;它允许我们像组件添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 数据驱动试图 本质&#xff1a;和普通JS变量不同的是&#xff0c;状态变量一旦发生变化组件的视图UI也会随着变化(数据驱动试图) 使用 修改状态 注意&am…

LabVIEW异步和同步通信详细分析及比较

1. 基本原理 异步通信&#xff1a; 原理&#xff1a;异步通信&#xff08;Asynchronous Communication&#xff09;是一种数据传输方式&#xff0c;其中数据发送和接收操作在独立的时间进行&#xff0c;不需要在特定时刻对齐。发送方在任何时刻可以发送数据&#xff0c;而接收…

Java猿社区—理解Java中的字符串比较机制

Java中的字符串比较是一个经典且常见的问题&#xff0c;尤其是在面试中。本文将详细探讨通过三种不同方式创建的字符串对象之间的比较机制&#xff0c;并扩展相关的技术问题&#xff0c;帮助读者深入理解Java的字符串处理。 文章目录 1. Java中的字符串对象创建方式2. 和equals…

在AWS创建一台Windows主机并登录

正文共&#xff1a;1111 字 21 图&#xff0c;预估阅读时间&#xff1a;1 分钟 因为之前微软云Azure免费&#xff0c;我们还做了简单的测试&#xff08;白嫖党618福利&#xff01;来Azure领200美刀&#xff01;外加云主机免费用一年&#xff01;&#xff09;&#xff1b;并且通…

睡前故事—绿色科技的未来:可持续发展的梦幻故事

欢迎来到《Bedtime Stories Time》。这是一个我们倾听、放松、并逐渐入睡的播客。感谢你收听并支持我们&#xff0c;希望你能将这个播客作为你睡前例行活动的一部分。今晚我们将讲述绿色科技的未来&#xff1a;可持续发展的梦幻故事的故事。一个宁静的夜晚&#xff0c;希望你现…

【15】Android基础知识之Window(一)

概述 这篇文章纠结了很久&#xff0c;在想需要怎么写&#xff1f;因为window有关的篇幅&#xff0c;如果需要讲起来那可太多了。从层级&#xff0c;或是从关联&#xff0c;总之不是很好开口。这次也下定决心&#xff0c;决定从浅入深的讲讲window这个东西。 Window Window是…

Win10+Docker配置TensorRT环境

1.Docker下载和安装 Docker下载:Install Docker Desktop on Windows Docker安装: 勾选直接下一步就行,安装完成后需要电脑重启。 重启后,选择Accept—>Continue without signing in—>skip survey. 可以进入下面页面,并且左下角是绿色的,显示e…

【踩坑日记】【教程】嵌入式 Linux 通过 nfs 下载出现 T T T T [Retry count exceeded: starting again]

文章目录 1 本篇文章解决的问题2 问题解决原理3 问题环境4 开启 ubuntu-20.04 的 nfs24.1 确认 nfs2 是否已经开启4.2 开启 nfs2 5 卸载 iptables5.1 卸载 iptables5.2 禁用 ufw5.3 尝试重新下载 6 原理分析6.1 nfs2 开启部分6.2 卸载 iptables 部分 7 后记7.1 拓扑结构一7.2 拓…

打包一个自己的Vivado IP核

写在前面 模块复用是逻辑设计人员必须掌握的一个基本功&#xff0c;通过将成熟模块打包成IP核&#xff0c;可实现重复利用&#xff0c;避免重复造轮子&#xff0c;大幅提高我们的开发效率。 接下来将之前设计的串口接收模块和串口发送模块打包成IP核&#xff0c;再分别调用…

Automation Anywhere推出新一代AI+自动化企业系统,助力企业实现10倍商业增长

RPA厂商纷纷进军AI Agent ( AI 代理)领域&#xff0c;陆续推出创新产品。最近&#xff0c;Automation Anywhere宣布推出其新的AI 自动化企业系统&#xff0c;该系统结合AI和自动化技术&#xff0c;以实现指数级的业务成果。 在Imagine 2024大会上首次亮相的这款新产品&#xf…

redis基本类型和订阅

redis-cli -h <host> -p <port> -a <password> 其中&#xff0c;< host>是Redis服务器的主机名或IP地址&#xff0c;< port>是Redis服务器的端口号&#xff0c;< password>是Redis服务器的密码&#xff08;如果有的话&#xff09;。 set …

Python | Leetcode Python题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:m, n len(matrix), len(matrix[0])x, y 0, n - 1while x < m and y > 0:if matrix[x][y] target:return Trueif matrix[x][y] > tar…

【java】力扣 合并两个有序数组

文章目录 题目链接题目描述代码第一种第二种 题目链接 88.合并两个有序数组 题目描述 代码 第一种 public void merge(int[] nums1, int m, int[] nums2, int n) {for(int i 0;i<n;i){nums1[mi] nums2[i];}Arrays.sort(nums1);}第二种 public void merge(int[] nums1,…

学习笔记——动态路由——IS-IS中间系统到中间系统(特性之路由泄漏)

3、路由泄漏 什么是路由泄漏&#xff1f; IS-IS路由协议允许路由信息的两级层次结构。可以有多个1级区域通过连续的2级主干互连。路由器可以属于1级、2级或两者。1级链路状态数据库仅包含有关该区域的信息。第2级链路状态数据库包含有关该级别以及每个第1级区域的信息。L1/L2…

【HarmonyOS学习】Calendar Kit日历管理

简介 Calendar Kit提供日历与日程管理能力&#xff0c;包括日历的获取和日程的创建能力。 Calendar Kit为用户提供了一系列接口来获取日历账户&#xff0c;并使用特定的接口向日历账户中写入日程。 如果写入的日程带有提醒时间则系统会在时间到达时向用户发送提醒。 约束点…

解决vue3中el-input在form表单按下回车刷新页面

问题&#xff1a;在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面 原因&#xff1a; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 解决方法 &#xff1a; 再写一个input 表单 &#xff0c;并设置style"display:none&…

【学习笔记】虚幻SkeletalMesh学习(一)基础介绍

文章目录 零、前言一、资源介绍1.1 骨架资源1.2 骨架网格体资源 二、UE4中的定义2.1 骨骼数据2.2 模型网格数据 三、渲染3.1 RenderData的初始化3.2 渲染对象的创建3.3 渲染对象的更新3.3.1 游戏线程的更新&#xff08;*FSkeletalMeshObjectGPUSkin::Update*&#xff09;3.3.2 …

MSSQL Server运维常用SQL命令

1、数据库连接数 select name, state, state_desc from sys.databases; 查询结果&#xff1a; 2、数据库状态 select name, state, state_desc from sys.databases; 查询结果&#xff1a; 3、数据文件状态 select a.name, b.physical_name, b.state, b.state_desc from sy…