此IP输入控件支持可通过tab,值大于255,点击.按钮,或者左右键切换等来实现切换输入框。
单个输入框功能,限制大小0-255;
#ifndef CMYIPPARTLINEEDIT_H
#define CMYIPPARTLINEEDIT_H#include <QLineEdit>class CMyIpPartLineEdit : public QLineEdit
{Q_OBJECTpublic:CMyIpPartLineEdit(QWidget *parent = 0,int nType = 0);~CMyIpPartLineEdit();void set_nexttab_edit(QLineEdit *nexttab) { next_tab_ = nexttab; }void setEditCursorPosition(int nType);
public:signals:void keyPressLeftOrRight(int,int);protected:virtual void focusInEvent(QFocusEvent *e);virtual void keyPressEvent(QKeyEvent *event);  private slots:void text_edited(const QString& text);private:QLineEdit *next_tab_;int m_nType;
};#endif // CMYIPPARTLINEEDIT_H
#include "CMyIpPartLineEdit.h"#include <QIntValidator>
#include <QKeyEvent>CMyIpPartLineEdit::CMyIpPartLineEdit(QWidget *parent/* = 0*/,int nType)
: QLineEdit(parent)
{next_tab_ = NULL;this->setMaxLength(3);this->setFrame(false);this->setAlignment(Qt::AlignCenter);QValidator *validator = new QIntValidator(0, 255, this);this->setValidator(validator);switch(nType){case 0://第一个setStyleSheet("QLineEdit{border-right:0px;}");break;case 1://第二个setStyleSheet("QLineEdit{border-left:0px;border-right:0px;}");break;case 2://第三个setStyleSheet("QLineEdit{border-left:0px;border-right:0px;}");break;case 3:setStyleSheet("QLineEdit{border-left:0px;}");break;}m_nType = nType;connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(text_edited(const QString&)));
}CMyIpPartLineEdit::~CMyIpPartLineEdit(void)
{
}void CMyIpPartLineEdit::focusInEvent(QFocusEvent *e)
{this->selectAll();QLineEdit::focusInEvent(e);
}void CMyIpPartLineEdit::keyPressEvent(QKeyEvent *event)
{if (event->key() == Qt::Key_Period){if (next_tab_){next_tab_->setFocus();next_tab_->selectAll();}}else if (event->key() == Qt::Key_Left){if (cursorPosition() == 0&&m_nType!=0){emit keyPressLeftOrRight((int)Qt::Key_Left,m_nType-1);}}else if (event->key() == Qt::Key_Right){if (cursorPosition() == text().size()&&m_nType!=3){emit keyPressLeftOrRight((int)Qt::Key_Right,m_nType+1);}}QLineEdit::keyPressEvent(event);
}void CMyIpPartLineEdit::text_edited(const QString& text)
{QIntValidator v(0, 255, this);QString ipaddr = text;int pos = 0;QValidator::State state = v.validate(ipaddr, pos); if (state == QValidator::Acceptable){if (ipaddr.size() > 1){if (ipaddr.size() == 2){int ipnum = ipaddr.toInt();if (ipnum > 25){if (next_tab_){next_tab_->setFocus();next_tab_->selectAll();}    }}else{if (next_tab_){next_tab_->setFocus();next_tab_->selectAll();}    }}}
}void CMyIpPartLineEdit::setEditCursorPosition(int nType)
{setFocus();int nSize = 0;if (nType == Qt::Key_Left){nSize = text().size();}setCursorPosition(nSize);
}

整个IP控件实现,已经样式表实现控件样式。实现随设置大小自适应,建议大于80。实现左右按钮切换。

#ifndef CMYIPADDREDIT_H
#define CMYIPADDREDIT_H#include <QWidget>
#include <QLabel>
#include <QResizeEvent>
#include "cmyippartlineedit.h"class CMyIpAddrEdit : public QWidget
{Q_OBJECTpublic:CMyIpAddrEdit(QWidget *parent = 0);~CMyIpAddrEdit();void setText(const QString &text);QString text();void setStyleSheet(const QString &styleSheet);void setEnabled(bool);
signals:void textchanged(const QString& text);void textedited(const QString &text);public slots:void onKeyPressLeftOrRight(int,int);
protected:void resizeEvent(QResizeEvent* event);private slots:void textchangedslot(const QString& text);void texteditedslot(const QString &text);private:CMyIpPartLineEdit *ip_part1_;CMyIpPartLineEdit *ip_part2_;CMyIpPartLineEdit *ip_part3_;CMyIpPartLineEdit *ip_part4_;QLabel *labeldot1_;QLabel *labeldot2_;    QLabel *labeldot3_;
};#endif // CMYIPADDREDIT_H
#include "cmyipaddredit.h"
#include <QValidator>CMyIpAddrEdit::CMyIpAddrEdit(QWidget *parent): QWidget(parent)
{ip_part1_ = new CMyIpPartLineEdit(this,0);ip_part2_ = new CMyIpPartLineEdit(this,1);ip_part3_ = new CMyIpPartLineEdit(this,2);ip_part4_ = new CMyIpPartLineEdit(this,3);labeldot1_ = new QLabel(this);labeldot2_ = new QLabel(this);labeldot3_ = new QLabel(this);labeldot1_->setText(" .");labeldot1_->setAlignment(Qt::AlignCenter);labeldot2_->setText(" .");labeldot2_->setAlignment(Qt::AlignCenter);labeldot3_->setText(" .");labeldot3_->setAlignment(Qt::AlignCenter);QWidget::setTabOrder(ip_part1_, ip_part2_);QWidget::setTabOrder(ip_part2_, ip_part3_);QWidget::setTabOrder(ip_part3_, ip_part4_);ip_part1_->set_nexttab_edit(ip_part2_);ip_part2_->set_nexttab_edit(ip_part3_);ip_part3_->set_nexttab_edit(ip_part4_);connect(ip_part1_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));connect(ip_part2_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));connect(ip_part3_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));connect(ip_part4_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));connect(ip_part1_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));connect(ip_part2_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));connect(ip_part3_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));connect(ip_part4_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));connect(ip_part1_, SIGNAL(keyPressLeftOrRight(int,int)), this, SLOT(onKeyPressLeftOrRight(int,int)));connect(ip_part2_, SIGNAL(keyPressLeftOrRight(int,int)), this, SLOT(onKeyPressLeftOrRight(int,int)));connect(ip_part3_, SIGNAL(keyPressLeftOrRight(int,int)), this, SLOT(onKeyPressLeftOrRight(int,int)));connect(ip_part4_, SIGNAL(keyPressLeftOrRight(int,int)), this, SLOT(onKeyPressLeftOrRight(int,int)));
}CMyIpAddrEdit::~CMyIpAddrEdit()
{}void CMyIpAddrEdit::textchangedslot(const QString& /*text*/)
{QString ippart1, ippart2, ippart3, ippart4;ippart1 = ip_part1_->text();ippart2 = ip_part2_->text();ippart3 = ip_part3_->text();ippart4 = ip_part4_->text();QString ipaddr = QString("%1.%2.%3.%4").arg(ippart1).arg(ippart2).arg(ippart3).arg(ippart4);emit textchanged(ipaddr);
}void CMyIpAddrEdit::texteditedslot(const QString &/*text*/)
{QString ippart1, ippart2, ippart3, ippart4;ippart1 = ip_part1_->text();ippart2 = ip_part2_->text();ippart3 = ip_part3_->text();ippart4 = ip_part4_->text();QString ipaddr = QString("%1.%2.%3.%4").arg(ippart1).arg(ippart2).arg(ippart3).arg(ippart4);emit textedited(ipaddr);
}void CMyIpAddrEdit::setText(const QString &text)
{QString ippart1, ippart2, ippart3, ippart4;QString qstring_validate = text;// IP地址验证QRegExp regexp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");QRegExpValidator regexp_validator(regexp, this);int nPos = 0;QValidator::State state = regexp_validator.validate(qstring_validate, nPos);// IP合法if (state == QValidator::Acceptable){QStringList ippartlist = text.split(".");int strcount = ippartlist.size();int index = 0;if (index < strcount){ippart1 = ippartlist.at(index);}if (++index < strcount){ippart2 = ippartlist.at(index);}if (++index < strcount){ippart3 = ippartlist.at(index);}if (++index < strcount){ippart4 = ippartlist.at(index);}}ip_part1_->setText(ippart1);ip_part2_->setText(ippart2);ip_part3_->setText(ippart3);ip_part4_->setText(ippart4);
}QString CMyIpAddrEdit::text()
{QString ippart1, ippart2, ippart3, ippart4;ippart1 = ip_part1_->text();ippart2 = ip_part2_->text();ippart3 = ip_part3_->text();ippart4 = ip_part4_->text();return QString("%1.%2.%3.%4").arg(ippart1).arg(ippart2).arg(ippart3).arg(ippart4);
}void CMyIpAddrEdit::setStyleSheet(const QString &styleSheet)
{ip_part1_->setStyleSheet(styleSheet);ip_part2_->setStyleSheet(styleSheet);ip_part3_->setStyleSheet(styleSheet);ip_part4_->setStyleSheet(styleSheet);
}void CMyIpAddrEdit::onKeyPressLeftOrRight(int nkeyType,int nNewLineEditType)
{switch(nNewLineEditType){case 0:ip_part1_->setEditCursorPosition(nkeyType);break;case 1:ip_part2_->setEditCursorPosition(nkeyType);break;case 2:ip_part3_->setEditCursorPosition(nkeyType);break;case 3:ip_part4_->setEditCursorPosition(nkeyType);break;}
}void CMyIpAddrEdit::setEnabled(bool bEnable)
{ip_part1_->setEnabled(bEnable);ip_part2_->setEnabled(bEnable);ip_part3_->setEnabled(bEnable);ip_part4_->setEnabled(bEnable);labeldot1_->setEnabled(bEnable);labeldot2_->setEnabled(bEnable);labeldot3_->setEnabled(bEnable);
}void CMyIpAddrEdit::resizeEvent(QResizeEvent* event)
{int nWidth = width()/4;int nHeight = height();ip_part1_->setGeometry(QRect(0, 0, nWidth, nHeight));ip_part2_->setGeometry(QRect(nWidth, 0, nWidth, nHeight));ip_part3_->setGeometry(QRect(nWidth*2, 0, nWidth, nHeight));ip_part4_->setGeometry(QRect(nWidth*3, 0, width()-nWidth*3, nHeight));labeldot1_->setGeometry(QRect(nWidth-3, 1, 6, nHeight-2));labeldot2_->setGeometry(QRect(nWidth*2-3, 1, 6, nHeight-2));labeldot3_->setGeometry(QRect(nWidth*3-3, 1, 6, nHeight-2));
}

QT 实现自定义的IP地址控件相关推荐

  1. vc中IP地址控件的使用

    CIPAddressCtrl类:提供了IP地址控件的功能 CIPAddressCtrl::ClearAddress 清除IP地址控件中的内容.void ClearAddress(); CIPAddre ...

  2. winform之ip地址控件textBox

    C# winform 显示编辑ip地址,无需重绘textBox或者重写textBox方法,只需要在原生textBox控件对应事件中实现对应的算法即可. 1.textBox keyUp事件 privat ...

  3. QT中封装的IP地址的widget

    QT没有提供一个完整的IP地址控件, 1. 可以使用QLineEdit简单的实现     QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\ ...

  4. VC MFC C++ IPControl CIPAddressCtrl IP输入控件使用

    直接通过控件ID获取控件指针来操作控件(不用声明变量) CIPAddressCtrl* mIPAddressCtrl_ServerIP = ((CIPAddressCtrl*)GetDlgItem(I ...

  5. 继承QWidget使用QPainter自定义二维图形控件【Qt学习】

    继承QWidget使用QPainter自定义二维图形控件[Qt学习] 通过阅读该文章,将了解本文所说的二维图形控件的基本概念.为何要自定义二维图形控件.如何自定义二维图形控件. 该文章将首先进行一些书 ...

  6. 在vb中实现真正锁定的带自定义菜单的文本控件

    在vb中实现真正锁定的带自定义菜单的文本控件 /// ///这个东西的出台,是由于一个网友的帖子,太气人,我才写的,很匆忙,又什么问题,请指出!谢谢 //QQ:9181729/mail:shawfil ...

  7. qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...

    前言勇哥对于C语言,C++早些年有一些接触,这个系列贴子就记载一下C++应用框架的学习经验. 在写程序时,UI.基础类库.应用程序框架对于vc来讲,只能依靠MFC和QT了. 勇哥对MFC有很强的抵触, ...

  8. `QStyle`自定义重绘`QSlider`控件

    简介: 根据QStyle的继承关系和重绘原理:通过实现一个继承QCommonStyle类的实现,实现自己的自定义控件QSlider控件. 文章目录 本博文的简述or解决问题? 系列博文: 运行效果: ...

  9. Android自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

最新文章

  1. 论文笔记 Medical Entity Linking using Triplet Network
  2. Android studio官网资料
  3. Nginx 容器教程
  4. 前后台传参类型、格式不同,解决思路
  5. springboot切面返回值_SpringBoot实战15-Spring基础-AOP
  6. C++设计模式之抽象工厂模式
  7. docker 安装入门
  8. 按条件分类_保税仓储企业能否同时存储非保货物?“仓储货物安装台分类监管”如何申请?...
  9. Vue之$nextTick属性
  10. 一些有用的javascript实例分析(二)
  11. 深度解析开源推荐算法框架EasyRec的核心概念和优势
  12. hadoop大数据开发基础_Java大数据开发(三)Hadoop(2)经典的Hadoop
  13. 【文末有奖】华为云“网红”语言Python课程来啦!
  14. *HDU1846HDU2188 巴什博奕
  15. 计算机怎么新建word文档,右键新建没有word文档怎么办?Win10新建word文档的方法...
  16. nginx配置文件被删怎么找回_恢复误删除的Nginx日志
  17. 小米11刷root记录
  18. 【数学建模】主成因分析
  19. php 关注微信触发事件,微信api 关注事件
  20. QComboBox下拉选择框

热门文章

  1. S3C6410开发(1)-初步入门
  2. ADuM磁隔离芯片与6N137光耦隔离比较
  3. 超六成专科生月薪低于5000元,普通本/专科生的出路在哪儿?
  4. zadig提取驱动地址以及cmd命令行运行驱动命令
  5. 安卓获取不到imsi_android 代码获取IMEI,IMSI都为空,怎么解决?
  6. win10安装包管理工具Chocolatey
  7. 百度地图,读取后台值,获取地点坐标
  8. Excel如何制作工资条,Leo老师来教你
  9. 魔方机器人(基于OpenCV、Arduino)
  10. 基于matlab的磁悬浮控制系统,基于MatLab的磁悬浮球控制系统的设计