first commit
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
#include "IPEdit.h"
|
||||
#include <QPainter>
|
||||
#include <QApplication>
|
||||
#include <QStyle>
|
||||
#include <QStyleOptionButton>
|
||||
#include <QKeyEvent>
|
||||
#include <QShortcutEvent>
|
||||
#include <QRegExpValidator>
|
||||
#include <QRegExp>
|
||||
#include <QClipboard>
|
||||
#include <QDebug>
|
||||
|
||||
IPEdit::IPEdit(QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
IPEdit::~IPEdit()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void IPEdit::init()
|
||||
{
|
||||
m_layout = new QHBoxLayout(this);
|
||||
m_layout->setSpacing(3);
|
||||
m_layout->setContentsMargins(2, 0, 2, 0);
|
||||
|
||||
m_edit1 = new QLineEdit(this);
|
||||
m_edit2 = new QLineEdit(this);
|
||||
m_edit3 = new QLineEdit(this);
|
||||
m_edit4 = new QLineEdit(this);
|
||||
|
||||
initForEdit(m_edit1);
|
||||
initForEdit(m_edit2);
|
||||
initForEdit(m_edit3);
|
||||
initForEdit(m_edit4);
|
||||
|
||||
m_dot1 = new QLabel(".", this);
|
||||
m_dot2 = new QLabel(".", this);
|
||||
m_dot3 = new QLabel(".", this);
|
||||
|
||||
m_layout->addWidget(m_edit1, 1);
|
||||
m_layout->addWidget(m_dot1);
|
||||
m_layout->addWidget(m_edit2, 1);
|
||||
m_layout->addWidget(m_dot2);
|
||||
m_layout->addWidget(m_edit3, 1);
|
||||
m_layout->addWidget(m_dot3);
|
||||
m_layout->addWidget(m_edit4, 1);
|
||||
}
|
||||
|
||||
void IPEdit::initForEdit(QLineEdit* edit)
|
||||
{
|
||||
edit->setFrame(false);
|
||||
edit->setAlignment(Qt::AlignCenter);
|
||||
edit->installEventFilter(this);
|
||||
|
||||
QRegExpValidator* validator = new QRegExpValidator(QRegExp("^(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$"), this);
|
||||
edit->setValidator(validator);
|
||||
|
||||
connect(edit, SIGNAL(textChanged(const QString&)), this, SLOT(editTextChanged(const QString&)));
|
||||
}
|
||||
|
||||
QLineEdit* IPEdit::nextEdit(QLineEdit* curEdit)
|
||||
{
|
||||
if (curEdit == m_edit1)
|
||||
return m_edit2;
|
||||
else if (curEdit == m_edit2)
|
||||
return m_edit3;
|
||||
else if (curEdit == m_edit3)
|
||||
return m_edit4;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool IPEdit::isEdit(QObject* object)
|
||||
{
|
||||
return (object == m_edit1 ||
|
||||
object == m_edit2 ||
|
||||
object == m_edit3 ||
|
||||
object == m_edit4);
|
||||
}
|
||||
|
||||
QString IPEdit::text()
|
||||
{
|
||||
QString sec1 = m_edit1->text().isEmpty() ? "0" : m_edit1->text();
|
||||
QString sec2 = m_edit2->text().isEmpty() ? "0" : m_edit2->text();
|
||||
QString sec3 = m_edit3->text().isEmpty() ? "0" : m_edit3->text();
|
||||
QString sec4 = m_edit4->text().isEmpty() ? "0" : m_edit4->text();
|
||||
return QString("%1.%2.%3.%4").arg(sec1).arg(sec2).arg(sec3).arg(sec4);
|
||||
}
|
||||
|
||||
void IPEdit::setText(const QString& text)
|
||||
{
|
||||
QRegExp reg("^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$");
|
||||
if (!reg.exactMatch(text))
|
||||
return;
|
||||
|
||||
QStringList ips = text.split(".");
|
||||
m_edit1->setText(ips.at(0));
|
||||
m_edit2->setText(ips.at(1));
|
||||
m_edit3->setText(ips.at(2));
|
||||
m_edit4->setText(ips.at(3));
|
||||
}
|
||||
|
||||
void IPEdit::paintEvent(QPaintEvent* event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
|
||||
QStyleOptionFrame option;
|
||||
option.initFrom(this);
|
||||
option.lineWidth = 1;
|
||||
style()->drawPrimitive(QStyle::PE_PanelLineEdit, &option, &painter, this);
|
||||
QWidget::paintEvent(event);
|
||||
}
|
||||
|
||||
bool IPEdit::eventFilter(QObject* object, QEvent* event)
|
||||
{
|
||||
if (isEdit(object))
|
||||
{
|
||||
if (event->type() == QEvent::KeyPress)
|
||||
{
|
||||
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
|
||||
if (keyEvent->key() == Qt::Key_Period)
|
||||
{
|
||||
QLineEdit* next = nextEdit(qobject_cast<QLineEdit*>(object));
|
||||
if (next)
|
||||
{
|
||||
next->setFocus();
|
||||
next->selectAll();
|
||||
}
|
||||
}
|
||||
else if (keyEvent->matches(QKeySequence::Paste))
|
||||
{
|
||||
QString clip = QApplication::clipboard()->text(QClipboard::Clipboard);
|
||||
if (clip.split(".").size() == 4)
|
||||
{
|
||||
setText(clip);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return QWidget::eventFilter(object, event);
|
||||
}
|
||||
|
||||
void IPEdit::editTextChanged(const QString& text)
|
||||
{
|
||||
QLineEdit* curEdit = qobject_cast<QLineEdit*>(sender());
|
||||
if (text.size() == 3)
|
||||
{
|
||||
QLineEdit* next = nextEdit(curEdit);
|
||||
if (next)
|
||||
{
|
||||
next->setFocus();
|
||||
next->selectAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
#ifndef IPEDIT_H
|
||||
#define IPEDIT_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QLineEdit>
|
||||
#include <QSpinBox>
|
||||
#include <QLabel>
|
||||
#include <QBoxLayout>
|
||||
#include <QPaintEvent>
|
||||
|
||||
class IPEdit : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit IPEdit(QWidget *parent = 0);
|
||||
~IPEdit();
|
||||
|
||||
QString text();
|
||||
void setText(const QString& text);
|
||||
|
||||
protected:
|
||||
void init();
|
||||
void initForEdit(QLineEdit* edit);
|
||||
QLineEdit* nextEdit(QLineEdit* curEdit);
|
||||
bool isEdit(QObject* object);
|
||||
|
||||
virtual void paintEvent(QPaintEvent* event);
|
||||
virtual bool eventFilter(QObject* object, QEvent* event);
|
||||
|
||||
protected slots:
|
||||
void editTextChanged(const QString& text);
|
||||
|
||||
private:
|
||||
QBoxLayout* m_layout;
|
||||
QLineEdit* m_edit1;
|
||||
QLineEdit* m_edit2;
|
||||
QLineEdit* m_edit3;
|
||||
QLineEdit* m_edit4;
|
||||
QLabel* m_dot1;
|
||||
QLabel* m_dot2;
|
||||
QLabel* m_dot3;
|
||||
};
|
||||
|
||||
#endif // IPEDIT_H
|
||||
@@ -0,0 +1,9 @@
|
||||
# 用法
|
||||
``` cpp
|
||||
IPEdit* ipEdit = new IPEdit(this);
|
||||
ipEdit->setGeometry(10, 10, 130, 25);
|
||||
ipEdit->show();
|
||||
|
||||
ipEdit->setText("255.255.255.0");
|
||||
QString text = ipEdit->text();
|
||||
```
|
||||
Reference in New Issue
Block a user