- // MyIpPartLineEdit.h
- #pragma once
- #include <QLineEdit>
- class QWidget;
- class QFocusEvent;
- class QKeyEvent;
- class MyIpPartLineEdit : public QLineEdit
- {
- Q_OBJECT
- public:
- MyIpPartLineEdit(QWidget *parent = 0);
- ~MyIpPartLineEdit(void);
- void set_nexttab_edit(QLineEdit *nexttab) { next_tab_ = nexttab; }
- protected:
- virtual void focusInEvent(QFocusEvent *e);
- virtual void keyPressEvent(QKeyEvent *event);
- private slots:
- void text_edited(const QString& text);
- private:
- QLineEdit *next_tab_;
- };
- // MyIpPartLineEdit.cpp
- #include "MyIpPartLineEdit.h"
- #include <QIntValidator>
- #include <QKeyEvent>
- MyIpPartLineEdit::MyIpPartLineEdit(QWidget *parent/* = 0*/)
- : 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);
- connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(text_edited(const QString&)));
- }
- MyIpPartLineEdit::~MyIpPartLineEdit(void)
- {
- }
- void MyIpPartLineEdit::focusInEvent(QFocusEvent *e)
- {
- this->selectAll();
- QLineEdit::focusInEvent(e);
- }
- void MyIpPartLineEdit::keyPressEvent(QKeyEvent *event)
- {
- if (event->key() == Qt::Key_Period)
- {
- if (next_tab_)
- {
- next_tab_->setFocus();
- next_tab_->selectAll();
- }
- }
- QLineEdit::keyPressEvent(event);
- }
- void MyIpPartLineEdit::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();
- }
- }
- }
- }
- }
- // MyIpAddrEdit.h
- #pragma once
- #include <QWidget>
- 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 setStyleSheet(const QString &styleSheet);
- 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_;
- MyIpPartLineEdit *ip_part2_;
- MyIpPartLineEdit *ip_part3_;
- QLineEdit *ip_part4_;
- QLabel *labeldot1_;
- QLabel *labeldot2_;
- QLabel *labeldot3_;
- };
- // MyIpAddrEdit.cpp
- #include "MyIpAddrEdit.h"
- #include <QRegExpValidator>
- #include <QLabel>
- #include "MyIpPartLineEdit.h"
- MyIpAddrEdit::MyIpAddrEdit(QWidget* pParent /* = 0 */)
- : QWidget(pParent)
- {
- ip_part1_ = new MyIpPartLineEdit(this);
- ip_part2_ = new MyIpPartLineEdit(this);
- ip_part3_ = new MyIpPartLineEdit(this);
- ip_part4_ = new MyIpPartLineEdit(this);
- labeldot1_ = new QLabel(this);
- labeldot2_ = new QLabel(this);
- labeldot3_ = new QLabel(this);
- ip_part1_->setGeometry(QRect(0, 0, 30, 20));
- ip_part2_->setGeometry(QRect(30, 0, 30, 20));
- ip_part3_->setGeometry(QRect(60, 0, 30, 20));
- ip_part4_->setGeometry(QRect(90, 0, 30, 20));
- labeldot1_->setText(" .");
- labeldot1_->setGeometry(QRect(27, 1, 6, 18));
- labeldot1_->setAlignment(Qt::AlignCenter);
- labeldot2_->setText(" .");
- labeldot2_->setGeometry(QRect(57, 1, 6, 18));
- labeldot2_->setAlignment(Qt::AlignCenter);
- labeldot3_->setText(" .");
- labeldot3_->setGeometry(QRect(87, 1, 6, 18));
- 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&)));
- }
- 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();
- return QString("%1.%2.%3.%4")
- .arg(ippart1)
- .arg(ippart2)
- .arg(ippart3)
- .arg(ippart4);
- }
- void MyIpAddrEdit::setStyleSheet(const QString &styleSheet)
- {
- ip_part1_->setStyleSheet(styleSheet);
- ip_part2_->setStyleSheet(styleSheet);
- ip_part3_->setStyleSheet(styleSheet);
- ip_part4_->setStyleSheet(styleSheet);
- }
- //main.cpp
- #include <QApplication>
- #include <QDialog>
- #include "MyIpAddrEdit.h"
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- MyIpAddrEdit *ipAddr = new MyIpAddrEdit();
- ipAddr->settext("127.0.0.1");
- ipAddr->show();
- return app.exec();