[Qt] IP地址输入框实现
封装了一个ip地址的输入框。网络上下载了份代码,找不到哪里的了。经过修改之后,尽力让它的行为和windows的IP地址输入框的行为看起来像些。代码如下:
#ifndef IPADDREDIT_H
#define IPADDREDIT_H
#include <QWidget>
class QLineEdit;
class QLabel;
class CIpPartLineEdit;
class CIpAddrEdit : public QWidget
{
Q_OBJECT
public:
CIpAddrEdit(QWidget *parent = 0);
~CIpAddrEdit();
void m_vSetText(const QString &text);
QString m_strGetText();
void m_vSetStyleSheet(const QString &styleSheet);
signals:
void sigTextChanged(const QString &text);
void sigTextEdited(const QString &text);
private slots:
void slot_text_Changed(const QString &text);
void slot_text_Edited(const QString &text);
private:
CIpPartLineEdit * m_pIpPart1;
CIpPartLineEdit * m_pIpPart2;
CIpPartLineEdit * m_pIpPart3;
CIpPartLineEdit * m_pIpPart4;
QLabel * m_pDot1;
QLabel * m_pDot2;
QLabel * m_pDot3;
};
#endif // IPADDREDIT_H
#include <QRegExpValidator>
#include <QLabel>
#include "ippartlineedit.h"
#include "ipaddredit.h"
CIpAddrEdit::CIpAddrEdit(QWidget *parent) :
QWidget(parent)
{
m_pIpPart1 = new CIpPartLineEdit(this);
m_pIpPart2 = new CIpPartLineEdit(this);
m_pIpPart3 = new CIpPartLineEdit(this);
m_pIpPart4 = new CIpPartLineEdit(this);
m_pDot1 = new QLabel(this);
m_pDot2 = new QLabel(this);
m_pDot3 = new QLabel(this);
m_pIpPart1->setGeometry(QRect(0, 0, 42, 27));
m_pIpPart2->setGeometry(QRect(70, 0, 42, 27));
m_pIpPart3->setGeometry(QRect(140, 0, 42, 27));
m_pIpPart4->setGeometry(QRect(210, 0, 42, 27));
m_pDot1->setText("-");
m_pDot1->setGeometry(QRect(48, 5, 16, 16));
m_pDot1->setAlignment(Qt::AlignCenter);
m_pDot2->setText("-");
m_pDot2->setGeometry(QRect(118, 5, 16, 16));
m_pDot2->setAlignment(Qt::AlignCenter);
m_pDot3->setText("-");
m_pDot3->setGeometry(QRect(188, 5, 16, 16));
m_pDot3->setAlignment(Qt::AlignCenter);
QWidget::setTabOrder(m_pIpPart1, m_pIpPart2);
QWidget::setTabOrder(m_pIpPart2, m_pIpPart3);
QWidget::setTabOrder(m_pIpPart3, m_pIpPart4);
m_pIpPart1->m_vSetNextEdit(m_pIpPart2);
m_pIpPart2->m_vSetNextEdit(m_pIpPart3);
m_pIpPart3->m_vSetNextEdit(m_pIpPart4);
m_pIpPart2->m_vSetPreEdit(m_pIpPart1);
m_pIpPart3->m_vSetPreEdit(m_pIpPart2);
m_pIpPart4->m_vSetPreEdit(m_pIpPart3);
connect(m_pIpPart1, SIGNAL(textChanged(const QString&)), this, SLOT(slot_text_Changed(const QString&)));
connect(m_pIpPart2, SIGNAL(textChanged(const QString&)), this, SLOT(slot_text_Changed(const QString&)));
connect(m_pIpPart3, SIGNAL(textChanged(const QString&)), this, SLOT(slot_text_Changed(const QString&)));
connect(m_pIpPart4, SIGNAL(textChanged(const QString&)), this, SLOT(slot_text_Changed(const QString&)));
connect(m_pIpPart1, SIGNAL(textEdited(const QString&)), this, SLOT(slot_text_Edited(const QString&)));
connect(m_pIpPart2, SIGNAL(textEdited(const QString&)), this, SLOT(slot_text_Edited(const QString&)));
connect(m_pIpPart3, SIGNAL(textEdited(const QString&)), this, SLOT(slot_text_Edited(const QString&)));
connect(m_pIpPart4, SIGNAL(textEdited(const QString&)), this, SLOT(slot_text_Edited(const QString&)));
}
CIpAddrEdit::~CIpAddrEdit()
{
}
void CIpAddrEdit::slot_text_Changed(const QString &/*text*/)
{
QString strIpPart1 = m_pIpPart1->text();
QString strIpPart2 = m_pIpPart1->text();
QString strIpPart3 = m_pIpPart1->text();
QString strIpPart4 = m_pIpPart1->text();
QString strIpAddr = QString("%1.%2.%3.%4")
.arg(strIpPart1)
.arg(strIpPart2)
.arg(strIpPart3)
.arg(strIpPart4);
emit sigTextChanged(strIpAddr);
}
void CIpAddrEdit::slot_text_Edited(const QString &/*text*/)
{
QString strIpPart1 = m_pIpPart1->text();
QString strIpPart2 = m_pIpPart1->text();
QString strIpPart3 = m_pIpPart1->text();
QString strIpPart4 = m_pIpPart1->text();
QString strIpAddr = QString("%1.%2.%3.%4")
.arg(strIpPart1)
.arg(strIpPart2)
.arg(strIpPart3)
.arg(strIpPart4);
emit sigTextEdited(strIpAddr);
}
void CIpAddrEdit::m_vSetText(const QString &text)
{
QString strIpAddr = text;
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 iPos = 0;
QValidator::State state = regexp_validator.validate(strIpAddr, iPos);
if(state != QValidator::Acceptable)
{
return ;
}
QStringList ipAddrList = text.split(".");
//int iCount = ipAddrList.size();
QString strIpPart1 = ipAddrList.at(0);
QString strIpPart2 = ipAddrList.at(1);
QString strIpPart3 = ipAddrList.at(2);
QString strIpPart4 = ipAddrList.at(3);
m_pIpPart1->setText(strIpPart1);
m_pIpPart2->setText(strIpPart2);
m_pIpPart3->setText(strIpPart3);
m_pIpPart4->setText(strIpPart4);
}
QString CIpAddrEdit::m_strGetText()
{
QString strIpPart1 = m_pIpPart1->text();
QString strIpPart2 = m_pIpPart2->text();
QString strIpPart3 = m_pIpPart3->text();
QString strIpPart4 = m_pIpPart4->text();
return QString("%1.%2.%3.%4")
.arg(strIpPart1)
.arg(strIpPart2)
.arg(strIpPart3)
.arg(strIpPart4);
}
void CIpAddrEdit::m_vSetStyleSheet(const QString &styleSheet)
{
m_pIpPart1->setStyleSheet(styleSheet);
m_pIpPart2->setStyleSheet(styleSheet);
m_pIpPart3->setStyleSheet(styleSheet);
m_pIpPart4->setStyleSheet(styleSheet);
}
#ifndef IPPARTLINEEDIT_H
#define IPPARTLINEEDIT_H
#include <QLineEdit>
class QWidget;
class QFocusEvent;
class QKeyEvent;
class CIpPartLineEdit : public QLineEdit
{
Q_OBJECT
public:
CIpPartLineEdit(QWidget *parent = 0);
~CIpPartLineEdit();
void m_vSetPreEdit(QLineEdit *preEdit);
void m_vSetNextEdit(QLineEdit *nextEdit);
protected:
void focusInEvent(QFocusEvent *event);
void keyPressEvent(QKeyEvent *event);
private slots:
void slot_text_Edited(const QString & text);
private:
QLineEdit *m_preEdit;
QLineEdit *m_nextEdit;
};
#endif // IPPARTLINEEDIT_H
#include <QIntValidator>
#include <QKeyEvent>
#include "ippartlineedit.h"
CIpPartLineEdit::CIpPartLineEdit(QWidget *parent)
: QLineEdit(parent)
{
m_preEdit = NULL;
m_nextEdit = NULL;
this->setMaxLength(3);
//this->setFrame(false);
this->setAlignment(Qt::AlignCenter);
QValidator *validator = new QIntValidator(0, 255, this);
this->setValidator(validator);
connect(this, SIGNAL(textEdited(const QString&)),
this, SLOT(slot_text_Edited(const QString&)));
}
CIpPartLineEdit::~CIpPartLineEdit()
{
}
void CIpPartLineEdit::m_vSetPreEdit(QLineEdit *preEdit)
{
m_preEdit = preEdit;
}
void CIpPartLineEdit::m_vSetNextEdit(QLineEdit *nextEdit)
{
m_nextEdit = nextEdit;
}
void CIpPartLineEdit::focusInEvent(QFocusEvent *event)
{
this->selectAll();
QLineEdit::focusInEvent(event);
}
void CIpPartLineEdit::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Period)
{
if(m_nextEdit &&
(this->text().size()!=0) &&
(!this->hasSelectedText()))
{
m_nextEdit->setFocus();
m_nextEdit->selectAll();
}
}
if(event->key() == Qt::Key_Backspace)
{
if(m_preEdit &&
(this->text().size() == 0))
{
m_preEdit->setFocus();
m_preEdit->setCursorPosition( m_preEdit->text().size() );
}
}
QLineEdit::keyPressEvent(event);
}
void CIpPartLineEdit::slot_text_Edited(const QString & text)
{
QIntValidator v(0, 255, this);
QString ipAddr = text;
int iPos = 0;
QValidator::State state = v.validate(ipAddr, iPos);
if(state != QValidator::Acceptable)
{
return ;
}
if(ipAddr.size() <= 1)
{
return ;
}
if(ipAddr.size() == 2)
{
int iIpNum = ipAddr.toInt();
if(iIpNum > 25)
{
if(m_nextEdit)
{
m_nextEdit->setFocus();
m_nextEdit->selectAll();
}
}
}
else
{
if(m_nextEdit)
{
m_nextEdit->setFocus();
m_nextEdit->selectAll();
}
}
}
[Qt] IP地址输入框实现的更多相关文章
- WPF数字输入框和IP地址输入框
数字输入框 简介 在业务中,我们经常需要限制用户的输入,比如限制输入长度,限制只能输入数字等等.限制输入长度WPF内置的TextBox已经帮我们解决了,但是限制输入数字却并未在WPF中内置解决方案.使 ...
- IP地址输入框
<style> div.IPDiv{background:#ffffff;width:120;font-size:9pt;text-align:center;border:2 ridge ...
- Qt编写自定义控件68-IP地址输入框
一.前言 这个IP地址输入框控件,估计写烂了,网上随便一搜索,保证一大堆,估计也是因为这个控件太容易了,非常适合新手练手,一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式 ...
- JavaScript实现IP地址的输入框方式
最近遇到一些这样的需求:实现一种IP地址的输入方式,就是输入3个字符或自动跳到下一个输入框内,删除的时候,一个输入框没有了字符,自动跳回上一个输入框.看到这里,相信大家都有一些想法了,没错,这种方法就 ...
- QT正则表达式---针对IP地址
判断合法IP的QT正则表达式: bool IsIPaddress(QString ip) { QRegExp rx2("(//d+)(//.)(//d+)(//.)(//d+)(//.)(/ ...
- 【Qt】QT5 获取IP地址
QT获取本机IP地址 #include <QtNetwork/QHostAddress> #include <QtNetwork/QNetworkInterface> #inc ...
- Qt获取本机IP地址
Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...
- qt获取网络ip地址的类
最近在学习qt网络编程,基于tcp和udp协议. 看了一些别人的程序和qt4自带的例子,困扰我最大的问题就是获取ip的类,总结起来还挺多的. 主要介绍常用的QtNetwork Module中的QHos ...
- QT通过IP地址定位地址(用get方法取数据)
通过IP地址定位地址,是要通过查询数据库,如果自己做一个这样的数据库工作量就比较大,所以在网上找了一个查询IP地址的网址,通过调用这个网址查询来实现,但是这个有一定的弊端,如果没有网络或者这个网址不可 ...
随机推荐
- Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项
本文首先总结一下Bitmap的相关概念,然后通过一个实际的问题来分析设置BitmapFactory.options的注意事项,以减少不必要的内存占用率,避免发生OOM. 一. Bitmap的使用tri ...
- Android项目中如何用好构建神器Gradle?(转)
最近在忙团队并行开发的事情,主要是将各个团队的代码分库,一方面可以降低耦合,为后面模块插件化做铺垫,另一方面采用二进制编译,可以加快编译速度.分库遇到了一些问题,很多都要通过Gradle脚本解决,所以 ...
- Error prompt:“wget: unable to resolve host address”---Solution
//Situation System prompts that:"wget: unable to resolve host address". //Analysis Una ...
- 向ASP.NET服务器控件中嵌入CSS资源
Step1:于[项目解决方案]中右键新建[ASP.NET服务器控件]项目 Step2:于项目中添加[Resources]文件夹,于该文件夹下添加[CSS文件] Step3:单击该CSS文件,并将[属性 ...
- WEB文件上传下载功能
WEB文件上传下载在日常工作中经常用到的功能 这里用到JS库 http://files.cnblogs.com/meilibao/ajaxupload.3.5.js 上传代码段(HTML) <% ...
- spring 配置触发器 (类似于定时任务)
为什么会看这个? 发现项目中有的service中的方法没有地方调用.经查,发现在web.xml中加载的spring的配置文件中配置了这个方法, 经查这种方式是触发器,会定时执行,只需要配置一下.可以设 ...
- [<DDGuessYouLIkeModel 0x7c99faf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key star.
出现这个提示是由于以下原因造成: 这里我用到了MJExtension将字典转为模型,但再转为模型的时候,出现这个提示,原因就是因为NSInteger后面多一个一个“*” @property (nona ...
- php插入转义与查找转义
//转义用于查找 function deepslashes($data) { //判断data表现形式 if(empty($data)) { return $data; } return is_arr ...
- windows下安装php笔记
为了更深入的理解下服务端的配置 ,上篇文章讲了如何在windows下安装apache , 接下来再研究下在windows下安装php并且结合apache运行php环境, 纯属学习用 ^^ ,如果嫌麻烦 ...
- zepto源码研究 - zepto.js-4(常用的工具)
$.each: /** * 以集合每一个元素作为上下文,来执行回调函数 * @param elements * @param callback * @returns {*} */ $.each = f ...