#include "ipLineEdit.h"
ipPart::ipPart(QFrame *parent,int type):QLineEdit(parent),type_value(type)
{
nextLineEdit = NULL;
lastLineEdit = NULL;
flag = 1;
this->setAlignment(Qt::AlignCenter);
this->setFrame(false);
if(type_value == 0)
{
this->setMaxLength(3);
this->setValidator(new QIntValidator(0,255,this));
this->setText(tr("0"));
}
if(type_value == 1)
{
}
if(type_value == 2)
{
this->setMaxLength(2);
QRegExp rx;
rx.setPattern(QString("^[0-9A-Fa-f]+$"));
this->setValidator(new QRegExpValidator(rx,this));
this->setText(tr("FF"));
}
connect(this,SIGNAL(textChanged(QString)),this,SLOT(textIpvCheck(QString)));
connect(this,SIGNAL(sendMsg(QString)),this,SLOT(macModify(QString)));
}
ipPart::~ipPart()
{
}
//输入文本检查
void ipPart::textIpvCheck(const QString &text)
{
if(type_value == 0)
{
if(text.size()>1)
{
if(text.size()==2)
{
int num = text.toInt();
QString str = QString::number(num,10);
this->setText(str);
if(num > 25)
{
//移动焦点位置
if(nextLineEdit)
{
nextLineEdit->setFocus();
nextLineEdit->selectAll();
}
}
}
else
{
int num = text.toInt();
QString str = QString::number(num,10);
this->setText(str);
//移动焦点位置
if(nextLineEdit)
{
nextLineEdit->setFocus();
nextLineEdit->selectAll();
}
}
}
}
if(type_value == 1)
{
if(text.size() >= 4)
{
if(nextLineEdit)
{
nextLineEdit->setFocus();
nextLineEdit->selectAll();
}
}
}
if(type_value == 2)
{
//MAC地址删除操作
if(text.size() == 1)
{
if(this->cursorPosition() == 1)
{
QString tmpStr = this->text();
const char *str = tmpStr.toStdString().c_str();
char des[3] = {0};
strcpy(des,str);
des[1] = 'F';
des[2] = '\0';
this->setText(des);
this->setCursorPosition(1);
}
else //this->cursorPosition() == 0
{
QString tmpStr = this->text();
const char *str = tmpStr.toStdString().c_str();
char des[3] = {0};
strcpy(des,str);
des[1] = des[0];
des[0] = 'F';
des[2] = '\0';
this->setText(des);
this->setCursorPosition(0);
}
}
}
}
//MAC地址修改函数
void ipPart::macModify(QString macStr)
{
if(type_value == 2)
{
if((this->text().size() == 2) && (this->cursorPosition() != 2))
{
if(this->cursorPosition() == 0)
{
const char * keyStr = macStr.toStdString().c_str();
char sour[3] = {0};
strcpy(sour,keyStr);
strupr(sour); //将sour数组中的小写字母转换为大写
if(strspn(keyStr,MAC_AREA)) //判断输入是否在规定范围
{
QString tmpStr = this->text();
const char *str = tmpStr.toStdString().c_str();
char des[3] = {0};
strcpy(des,str);
des[0] = sour[0];
this->setText(des);
this->setCursorPosition(1);
}
}
else if(this->cursorPosition() == 1)
{
const char * keyStr = macStr.toStdString().c_str();
char sour[3] = {0};
strcpy(sour,keyStr);
strupr(sour);
if(strspn(keyStr,MAC_AREA)) //判断输入是否在规定范围
{
QString tmpStr = this->text();
const char *str = tmpStr.toStdString().c_str();
char des[3] = {0};
strcpy(des,str);
des[1] = sour[0];
this->setText(des);
if(nextLineEdit)
{
this->nextLineEdit->setFocus();
this->nextLineEdit->setCursorPosition(0);
}
}
}
}
}
}
//键盘事件(只包含小数点"." 删除键 光标移动键(左、右)的事件操作)
void ipPart::keyPressEvent(QKeyEvent *event)
{
//QMessageBox::information(this,"123",event->text()); //获取键盘输入的字符
if(event->key() == Qt::Key_Period)
{
//移动焦点位置
if(nextLineEdit)
{
if(this->text().isEmpty())
{
//do nothing
}
else if(this->hasSelectedText())
{
//do nothing
}
else
{
nextLineEdit->setFocus();
nextLineEdit->selectAll();
}
}
}
if(event->key() == Qt::Key_Backspace)
{
if(lastLineEdit && this->cursorPosition() == 0)
{
lastLineEdit->setFocus();
lastLineEdit->setCursorPosition(2);
}
}
if(event->key() == Qt::Key_Left)
{
//获取光标在文本框中的位置
if(this->cursorPosition() == 0)
{
if(lastLineEdit)
{
lastLineEdit->setFocus();
//lastLineEdit->selectAll();
}
}
}
if(event->key() == Qt::Key_Right)
{
//当字符串长度与光标的位置相等时证明光标在文本框的最后
if(this->cursorPosition() == this->text().length())
{
if(nextLineEdit)
{
nextLineEdit->setFocus();
}
}
}
if(!(m_keyStr = event->text()).isEmpty())
{
emit sendMsg(m_keyStr);
}
QLineEdit::keyPressEvent(event); //其余操作转交给父类的键盘事件处理函数处理
}
//以下两个函数键盘事件使用
void ipPart::getNextEdit(QLineEdit *nextEdit)
{
nextLineEdit = nextEdit;
}
void ipPart::getLastEdit(QLineEdit *lastEdit)
{
lastLineEdit = lastEdit;
}
/////////////////////////////////////////////////////////////////////////////////
//ip地址整体类的实现
ipLine::ipLine(QWidget *parent,int type):QFrame(parent),type_value(type)
{
if(type_value == IPV4)
{
ipv4LineInit();
}
if(type_value == IPV6)
{
}
if(type_value == MAC)
{
macLineInit();
}
this->setFixedSize(164,24);
}
ipLine::~ipLine()
{
}
void ipLine::ipv4LineInit()
{
ipv4Edit1 = new ipPart(this);
ipv4Edit2 = new ipPart(this);
ipv4Edit3 = new ipPart(this);
ipv4Edit4 = new ipPart(this);
QLabel *ipv4Label1 = new QLabel(tr("."),this);
QLabel *ipv4Label2 = new QLabel(tr("."),this);
QLabel *ipv4Label3 = new QLabel(tr("."),this);
ipv4Edit1->setGeometry(2,1,40,22);
ipv4Edit2->setGeometry(42,1,40,22);
ipv4Edit3->setGeometry(82,1,40,22);
ipv4Edit4->setGeometry(122,1,38,22);
ipv4Label1->setGeometry(40,1,2,22);
ipv4Label2->setGeometry(80,1,2,22);
ipv4Label3->setGeometry(120,1,2,22);
ipv4Edit1->getNextEdit(ipv4Edit2);
ipv4Edit2->getNextEdit(ipv4Edit3);
ipv4Edit3->getNextEdit(ipv4Edit4);
ipv4Edit4->getNextEdit(NULL);
ipv4Edit1->getLastEdit(NULL);
ipv4Edit2->getLastEdit(ipv4Edit1);
ipv4Edit3->getLastEdit(ipv4Edit2);
ipv4Edit4->getLastEdit(ipv4Edit3);
}
void ipLine::macLineInit()
{
macEdit1 = new ipPart(this,2);
macEdit2 = new ipPart(this,2);
macEdit3 = new ipPart(this,2);
macEdit4 = new ipPart(this,2);
macEdit5 = new ipPart(this,2);
macEdit6 = new ipPart(this,2);
QLabel *macLabel1 = new QLabel(tr(":"),this);
QLabel *macLabel2 = new QLabel(tr(":"),this);
QLabel *macLabel3 = new QLabel(tr(":"),this);
QLabel *macLabel4 = new QLabel(tr(":"),this);
QLabel *macLabel5 = new QLabel(tr(":"),this);
macEdit1->setGeometry(2,1,27,22);
macEdit2->setGeometry(29,1,27,22);
macEdit3->setGeometry(56,1,27,22);
macEdit4->setGeometry(83,1,27,22);
macEdit5->setGeometry(110,1,27,22);
macEdit6->setGeometry(137,1,25,22);
macLabel1->setGeometry(27,1,4,22);
macLabel2->setGeometry(54,1,4,22);
macLabel3->setGeometry(81,1,4,22);
macLabel4->setGeometry(108,1,4,22);
macLabel5->setGeometry(135,1,4,22);
macEdit1->getNextEdit(macEdit2);
macEdit2->getNextEdit(macEdit3);
macEdit3->getNextEdit(macEdit4);
macEdit4->getNextEdit(macEdit5);
macEdit5->getNextEdit(macEdit6);
macEdit6->getNextEdit(NULL);
macEdit1->getLastEdit(NULL);
macEdit2->getLastEdit(macEdit1);
macEdit3->getLastEdit(macEdit2);
macEdit4->getLastEdit(macEdit3);
macEdit5->getLastEdit(macEdit4);
macEdit6->getLastEdit(macEdit5);
}
//获取ip地址
QString ipLine::getInfor()
{
QString ipStr;
if(type_value == IPV4)
{
if(ipv4Edit1->text().isEmpty()&&ipv4Edit2->text().isEmpty()
&&ipv4Edit3->text().isEmpty()&&ipv4Edit4->text().isEmpty())
{
return "ip is empty";
}
else if(ipv4Edit1->text() == "0")
{
return " the first part of the ipaddress\n can not be 0";
}
else
{
ipStr = ipv4Edit1->text() + "." + ipv4Edit2->text() +
"." + ipv4Edit3->text() + "." + ipv4Edit4->text();
return ipStr;
}
}
if(type_value == IPV6)
{
}
if(type_value == MAC)
{
ipStr = macEdit1->text()+":"+macEdit2->text()+":"+macEdit3->text()+":"+macEdit4->text()+":"+macEdit5->text()+":"+macEdit6->text();
}
}
//地址设置函数(字符串处理函数,有点繁琐)
void ipLine::setInfor(const QString ipStr)
{
string ip_str = ipStr.toStdString();
const char* ch = ip_str.c_str();
if(type_value == IPV4)
{
char c = '.';
char tem[20] = {0};
strcpy(tem,ch);
char *temp = tem;
int tempNum = strchr(temp,c) - temp;
char buf[10] = {0};
strncpy(buf,temp,tempNum);
buf[tempNum] = '\0';
ipv4Edit1->setText(buf);
char *cc = ".";
temp = strstr(temp,cc)+1;
tempNum = strchr(temp,c) - temp;
strncpy(buf,temp,tempNum);
buf[tempNum] = '\0';
ipv4Edit2->setText(buf);
temp = strstr(temp,cc) + 1;
tempNum = strchr(temp,c) - temp;
strncpy(buf,temp,tempNum);
buf[tempNum] = '\0';
ipv4Edit3->setText(buf);
temp = strstr(temp,cc) + 1;
ipv4Edit4->setText(temp);
}
if(type_value == IPV6)
{
}
if(type_value == MAC)
{
char c = ':';
char tem[20] = {0};
strcpy(tem,ch);
char *temp = tem;
int tempNum = strchr(temp,c)-temp;
char buf[10] = {0};
strncpy(buf,temp,tempNum);
buf[tempNum] = '\0';
strupr(buf);
macEdit1->setText(buf);
char *cc = ":";
temp = strstr(temp,cc)+1;
tempNum = strchr(temp,c) - temp;
strncpy(buf,temp,tempNum);
buf[tempNum] = '\0';
strupr(buf);
macEdit2->setText(buf);
temp = strstr(temp,cc)+1;
tempNum = strchr(temp,c) - temp;
strncpy(buf,temp,tempNum);
buf[tempNum] = '\0';
strupr(buf);
macEdit3->setText(buf);
temp = strstr(temp,cc)+1;
tempNum = strchr(temp,c) - temp;
strncpy(buf,temp,tempNum);
buf[tempNum] = '\0';
strupr(buf);
macEdit4->setText(buf);
temp = strstr(temp,cc)+1;
tempNum = strchr(temp,c) - temp;
strncpy(buf,temp,tempNum);
buf[tempNum] = '\0';
strupr(buf);
macEdit5->setText(buf);
temp = strstr(temp,cc)+1;
strupr(temp);
macEdit6->setText(temp);
}
}
void ipLine::clear()
{
if(type_value == IPV4)
{
ipv4Edit1->clear();
ipv4Edit2->clear();
ipv4Edit3->clear();
ipv4Edit4->clear();
}
if(type_value == IPV6)
{
}
if(type_value == MAC)
{
macEdit1->clear();
macEdit2->clear();
macEdit3->clear();
macEdit4->clear();
macEdit5->clear();
macEdit6->clear();
}
}
//显示ip地址槽函数
void ipLine::disPlayInfor()
{
QMessageBox::information(this,"information",getInfor());
}