// 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(); }