qt默认没有ip控件,那就自己封装一个 ,window和linux均可使用
直接上代码
1、myipaddredit.h
#pragma once
#include <QFrame>
#include <QMouseEvent>
#include <QKeyEvent>
class QLineEdit;
class QLabel;
class MyIpPartLineEdit;
class MyIpAddrEdit : public QWidget
{
Q_OBJECT
public:
MyIpAddrEdit(QWidget* pParent = 0);
~MyIpAddrEdit();
void setText(const QString &text);
QString text();
void setHight(int hight);
void clear();
bool checkInlegal();
protected:
bool eventFilter(QObject *watched, QEvent *event);
signals:
void textchanged(const QString& text);
void textedited(const QString &text);
private slots:
void textchangedslot(const QString& text);
void texteditedslot(const QString &text);
private:
MyIpPartLineEdit *ip_part1_; //ip的四段
MyIpPartLineEdit *ip_part2_;
MyIpPartLineEdit *ip_part3_;
MyIpPartLineEdit *ip_part4_;
QLabel *labeldot1_; //'.'号
QLabel *labeldot2_;
QLabel *labeldot3_;
};
1、myipaddredit.cpp
#include "myipaddredit.h"
#include <QRegExpValidator>
#include <QLabel>
#include "myippartlineedit.h"
#include <QHBoxLayout>
#include <QClipboard>
#include <QApplication>
MyIpAddrEdit::MyIpAddrEdit(QWidget* pParent /* = 0 */)
: QWidget(pParent)
{
ip_part1_ = new MyIpPartLineEdit(this, 1);
ip_part2_ = new MyIpPartLineEdit(this, 2);
ip_part3_ = new MyIpPartLineEdit(this, 3);
ip_part4_ = new MyIpPartLineEdit(this, 4);
labeldot1_ = new QLabel(this);
labeldot2_ = new QLabel(this);
labeldot3_ = new QLabel(this);
//labeldot1_->setStyleSheet("QLabel{background-color: rgb(255, 255, 255);}");
//labeldot2_->setStyleSheet("QLabel{background-color: rgb(255, 255, 255);}");
//labeldot3_->setStyleSheet("QLabel{background-color: rgb(255, 255, 255);}");
//setStyleSheet("background-color: rgb(255, 255, 255);");
QHBoxLayout *hlayout = new QHBoxLayout;
hlayout->setMargin(1);
//hlayout->setContentsMargins(1,0,0,0);
hlayout->setSpacing(0);
hlayout->addWidget(ip_part1_);
hlayout->addWidget(labeldot1_);
hlayout->addWidget(ip_part2_);
hlayout->addWidget(labeldot2_);
hlayout->addWidget(ip_part3_);
hlayout->addWidget(labeldot3_);
hlayout->addWidget(ip_part4_);
this->setLayout(hlayout);
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_);
ip_part2_->set_pritab_edit(ip_part1_);
ip_part3_->set_pritab_edit(ip_part2_);
ip_part4_->set_pritab_edit(ip_part3_);
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&)));
ip_part1_->installEventFilter(this);
ip_part2_->installEventFilter(this);
ip_part3_->installEventFilter(this);
ip_part4_->installEventFilter(this);
}
MyIpAddrEdit::~MyIpAddrEdit()
{
}
void MyIpAddrEdit::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 MyIpAddrEdit::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 MyIpAddrEdit::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 MyIpAddrEdit::text()
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();
if(!this->checkInlegal()) return "";
return QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);
}
void MyIpAddrEdit::setHight(int hight)
{
ip_part1_->setFixedHeight(hight);
ip_part2_->setFixedHeight(hight);
ip_part3_->setFixedHeight(hight);
ip_part4_->setFixedHeight(hight);
labeldot1_->setFixedHeight(hight);
labeldot2_->setFixedHeight(hight);
labeldot3_->setFixedHeight(hight);
}
void MyIpAddrEdit::clear()
{
ip_part1_->clear();
ip_part2_->clear();
ip_part3_->clear();
ip_part4_->clear();
}
bool MyIpAddrEdit::checkInlegal()
{
return !(ip_part1_->text().isEmpty() || ip_part2_->text().isEmpty() || ip_part3_->text().isEmpty() || ip_part4_->text().isEmpty());
}
bool MyIpAddrEdit::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ip_part1_ || watched == ip_part2_ || watched == ip_part3_ || watched == ip_part4_)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->matches(QKeySequence::Paste))
{
if(keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == Qt::Key_V)
{
QClipboard *clipboard = QApplication::clipboard(); //获取系统剪贴板指针
QString originalText = clipboard->text();
setText(originalText);
}
}
}
}
}
3、上述代码中的MyIpPartLineEdit类
#pragma once
#include <QLineEdit>
class QWidget;
class QFocusEvent;
class QKeyEvent;
class MyIpPartLineEdit : public QLineEdit
{
Q_OBJECT
public:
MyIpPartLineEdit(QWidget *parent = 0,int index = 0);
~MyIpPartLineEdit(void);
void set_nexttab_edit(QLineEdit *nexttab) { next_tab_ = nexttab; }
void set_pritab_edit(QLineEdit *pritab) {pri_tab_ = pritab;}
protected:
//virtual void focusInEvent(QFocusEvent *e);
virtual void keyPressEvent(QKeyEvent *event);
private slots:
void text_edited(const QString& text);
private:
QLineEdit *next_tab_;
QLineEdit *pri_tab_;
};
4、myippartlineedit.cpp
#include "myippartlineedit.h"
#include <QIntValidator>
#include <QKeyEvent>
MyIpPartLineEdit::MyIpPartLineEdit(QWidget *parent/* = 0*/,int index)
: QLineEdit(parent)
{
next_tab_ = NULL;
pri_tab_ = NULL;
this->setFrame(false);
this->setAlignment(Qt::AlignHCenter);
QRegExp regexp;
if(index == 1)
{
regexp.setPattern("(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])");
}else{
regexp.setPattern("(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)|(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.");
}
QRegExpValidator *regexp_validator = new QRegExpValidator(regexp, this);
this->setValidator(regexp_validator);
connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(text_edited(const QString&)));
}
MyIpPartLineEdit::~MyIpPartLineEdit(void)
{
}
void MyIpPartLineEdit::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Backspace)
{
if(pri_tab_ != NULL && this->text().isEmpty())
{
pri_tab_->setFocus();
pri_tab_->selectAll();
}
}else if(event->key() == Qt::Key_Left){
if(pri_tab_ != NULL && cursorPosition() == 0){
pri_tab_->setFocus();
pri_tab_->setCursorPosition(pri_tab_->text().size());
}
}else if(event->key() == Qt::Key_Right){
if(next_tab_ != NULL & cursorPosition() == this->text().size()){
next_tab_->setFocus();
next_tab_->setCursorPosition(0);
}
}
QLineEdit::keyPressEvent(event);
}
void MyIpPartLineEdit::text_edited(const QString& text)
{
QString chanText = text;
int index = chanText.indexOf(".");
if(index >= 0)
{
chanText.remove(index,1);
this->setText(chanText);
if (next_tab_)
{
next_tab_->setFocus();
}
return ;
}
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();
}
}
}
}
}