百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Qt编写自定义控件68-IP地址输入框

toyiye 2024-08-17 00:19 9 浏览 0 评论

一、前言

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

开源地址:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo) [https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

二、实现的功能

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

* 2:可清空IP地址

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

* 4:支持退格键自动切换

* 5:支持IP地址过滤

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

三、效果图

五、核心代码

#pragma execution_character_set("utf-8")
#include "ipaddress.h"
#include "qlabel.h"
#include "qlineedit.h"
#include "qboxlayout.h"
#include "qregexp.h"
#include "qvalidator.h"
#include "qevent.h"
#include "qdebug.h"
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);
}
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;
 }
}

六、控件介绍

1. 超过160个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。

2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。

3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.13的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。

4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。

5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。

6. 每个控件默认配色和demo对应的配色都非常精美。

7. 超过130个可见控件,6个不可见控件。

8. 部分控件提供多种样式风格选择,多种指示器样式选择。

9. 所有控件自适应窗体拉伸变化。

10. 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。

11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。

12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。

13. 所有控件最后生成一个动态库文件(dll或者so等),可以直接集成到qtcreator中拖曳设计使用。

14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。

15. 自定义控件插件开放动态库使用(永久免费),无任何后门和限制,请放心使用。

16. 目前已提供32个版本的dll,其中qt_5_7_0_mingw530_32这个版本会一直保证最新的完整的。

17. 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!

18. Qt入门书籍推荐霍亚飞的《Qt Creator快速入门》《Qt5编程入门》,Qt进阶书籍推荐官方的《C++ GUI Qt4编程》。

19. 强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!

20. SDK地址:[https://gitee.com/feiyangqingyun/QUCSDK](https://gitee.com/feiyangqingyun/QUCSDK) [https://github.com/feiyangqingyun/qucsdk](https://github.com/feiyangqingyun/qucsdk)

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码