封装了一个ip地址的输入框。网络上下载了份代码,找不到哪里的了。经过修改之后,尽力让它的行为和windows的IP地址输入框的行为看起来像些。代码如下:

//ipaddredit.h

#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

//ipaddredit.cpp

#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);
}

//ippartlineedit.h

#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

//ippartlineedit.cpp

#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地址输入框实现的更多相关文章

  1. WPF数字输入框和IP地址输入框

    数字输入框 简介 在业务中,我们经常需要限制用户的输入,比如限制输入长度,限制只能输入数字等等.限制输入长度WPF内置的TextBox已经帮我们解决了,但是限制输入数字却并未在WPF中内置解决方案.使 ...

  2. IP地址输入框

    <style> div.IPDiv{background:#ffffff;width:120;font-size:9pt;text-align:center;border:2 ridge ...

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

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

  4. JavaScript实现IP地址的输入框方式

    最近遇到一些这样的需求:实现一种IP地址的输入方式,就是输入3个字符或自动跳到下一个输入框内,删除的时候,一个输入框没有了字符,自动跳回上一个输入框.看到这里,相信大家都有一些想法了,没错,这种方法就 ...

  5. QT正则表达式---针对IP地址

    判断合法IP的QT正则表达式: bool IsIPaddress(QString ip) { QRegExp rx2("(//d+)(//.)(//d+)(//.)(//d+)(//.)(/ ...

  6. 【Qt】QT5 获取IP地址

    QT获取本机IP地址 #include <QtNetwork/QHostAddress> #include <QtNetwork/QNetworkInterface> #inc ...

  7. Qt获取本机IP地址

    Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...

  8. qt获取网络ip地址的类

    最近在学习qt网络编程,基于tcp和udp协议. 看了一些别人的程序和qt4自带的例子,困扰我最大的问题就是获取ip的类,总结起来还挺多的. 主要介绍常用的QtNetwork Module中的QHos ...

  9. QT通过IP地址定位地址(用get方法取数据)

    通过IP地址定位地址,是要通过查询数据库,如果自己做一个这样的数据库工作量就比较大,所以在网上找了一个查询IP地址的网址,通过调用这个网址查询来实现,但是这个有一定的弊端,如果没有网络或者这个网址不可 ...

随机推荐

  1. Linux 机器之间建立互信

    原理: 就是两台机器(web-1和web-2)经过预先设置好经过认证的key文件,双方互相访问时,进行自动认证,从而实现互信.   互信的原理了解了,我们可以把配置ssh互信的步骤进行有效的分割. 1 ...

  2. Oracle数据库配置方式二--使用Net Manager配置数据库

    在Oracle安装配置中使用Net Configuration配置了数据库,今天给大家介绍第二种配置方式,Net Manager配置. 先找到我们的Net Manager的快捷方式,如下面截图

  3. Navicat:cant create OCI environment.

    一直在使用 Navicat ,这是一个数据库客户端软件,能连接多种不同类型的数据库,给我们的日常的工作带来了不少的便捷. 最近,我在电脑上安装了oracle的客户端ODTwihtODAC121012, ...

  4. \r \n有什么区别

    '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来.下面转一篇文章. 回车和换行 今天,我总算搞清楚“回车”(carriage return)和“换行 ...

  5. FineUI页面级别的参数配置

    Theme: 控件主题,目前支持三种主题风格(blue/gray/access,默认值:blue) Language: 控件语言(en/zh_CN/zh_TW/...,默认值:zh_CN) FormM ...

  6. 如何动态修改grid的列名

    有这样的需求,搜索时候会选择搜索类型,每种搜索类型展示的列名不一样 如何动态修改grid的列名 效果图:点击bColumn页面切换成bColumn 实现思路:通过grid的reconfigure方法, ...

  7. wordpress主题制作结构文件

    下面是WordPress主题文件层次结构,它会告诉你:当WordPress显示特定的页面类型时,会使用哪个模板文件呢?只有了解了以下主题层次结构,你才能知道你的WordPress主题到底需要写哪些文件 ...

  8. po 和 mo 的互相转换

    反编译 mo 文件成 po 文件 msgunfmt test.mo -o test.po 编码 po 文件为 mo 文件 msgfmt -o test.mo test.po 记着备用.

  9. Stream 基础和常用

    来源 : http://www.cnblogs.com/jimmyzheng/archive/2012/03/17/2402814.html 系列 目前只作为个人参考. 微软的 stream 结构老大 ...

  10. 对类HelloWorld程序中添加一个MessageBox弹窗

    对类HelloWorld程序中添加一个MessageBox弹窗 分析: 任一程序运行的时候都会加载kernel32.dll的,但MessageBoxA()这个API却是在user32.dll中的.所以 ...