#ifndef MAC_CONTROL_H
#define MAC_CONTROL_H
#include <QFrame>
#include <QLineEdit>
#include <QIntValidator>
#include "stdint.h"
#include <QHBoxLayout>
#include <QFont>
#include <QLabel>
#include <QKeyEvent>
class MacCtrl : public QFrame
{
Q_OBJECT
public:
MacCtrl(QWidget *parent = 0);
~MacCtrl();
virtual bool eventFilter(QObject *obj, QEvent *event);
QString getMacValue();
void setMacValue(QString ipValue);
public slots:
void slotTextChanged(QLineEdit* pEdit);
signals:
void signalTextChanged(QLineEdit* pEdit);
private:
enum
{
QTUTL_IP_SIZE = 6,//
MAX_DIGITS = 2 //
};
QLineEdit *(m_pLineEdit[QTUTL_IP_SIZE]);
void MoveNextLineEdit(int i);
void MovePrevLineEdit(int i);
};
#endif // IPCONTROL_H
#include "mac_control.h"
#include <QApplication>
#include <QClipboard>
MacCtrl::MacCtrl(QWidget *parent) : QFrame(parent)
{
setFrameShape(QFrame::StyledPanel);
setFrameShadow(QFrame::Sunken);
this->setStyleSheet("background-color:white");
QHBoxLayout* pLayout = new QHBoxLayout(this);
setLayout(pLayout);
pLayout->setContentsMargins(0, 0, 0, 0);
pLayout->setSpacing(0);
for (int i = 0; i != QTUTL_IP_SIZE; ++i)
{
if (i != 0)
{
QLabel* pDot = new QLabel(":", this);
QFont fontLbl = pDot->font();
fontLbl.setFamily("System");
fontLbl.setWeight(12);
fontLbl.setBold(true);
pDot->setFont(fontLbl);
pDot->setStyleSheet("background: white");
pLayout->addWidget(pDot);
pLayout->setStretch(pLayout->count(), 0);
}
m_pLineEdit[i] = new QLineEdit(this);
QLineEdit* pEdit = m_pLineEdit[i];
pEdit->installEventFilter(this);
pLayout->addWidget(pEdit);
pLayout->setStretch(pLayout->count(), 1);
pEdit->setFrame(false);
pEdit->setAlignment(Qt::AlignCenter);
QFont font;
font.setBold(true);
font.setFamily(QString::fromLocal8Bit("微软雅黑"));
font.setPointSize(12);
pEdit->setFont(font);
QRegExp rx("^[0-9a-zA-Z]{2}$");
QValidator *validator = new QRegExpValidator(rx, pEdit);
pEdit->setValidator(validator);
}
setMaximumWidth(50 * QTUTL_IP_SIZE);
connect(this, SIGNAL(signalTextChanged(QLineEdit*)),
this, SLOT(slotTextChanged(QLineEdit*)),
Qt::QueuedConnection);
}
MacCtrl::~MacCtrl()
{
}
void MacCtrl::slotTextChanged(QLineEdit* pEdit)
{
for (unsigned int i = 0; i != QTUTL_IP_SIZE; ++i)
{
if (pEdit == m_pLineEdit[i])
{
if ((pEdit->text().size() == MAX_DIGITS &&pEdit->text().size() == pEdit->cursorPosition()) || (pEdit->text() == "0"))
{
// auto-move to next item
if (i + 1 != QTUTL_IP_SIZE)
{
m_pLineEdit[i + 1]->setFocus();
m_pLineEdit[i + 1]->selectAll();
}
}
}
}
}
bool MacCtrl::eventFilter(QObject *obj, QEvent *event)
{
bool bRes = QFrame::eventFilter(obj, event);
if (event->type() == QEvent::KeyPress)
{
QKeyEvent* pEvent = dynamic_cast<QKeyEvent*>(event);
if (pEvent)
{
if ((pEvent->key() == Qt::Key_V) && (pEvent->modifiers() == Qt::ControlModifier))
{
QClipboard *clipboard = QApplication::clipboard(); //获取系统剪贴板指针
QString originalText = clipboard->text();
originalText = originalText.trimmed();
setMacValue(originalText);
return true;
}
for (unsigned int i = 0; i != QTUTL_IP_SIZE; ++i)
{
QLineEdit* pEdit = m_pLineEdit[i];
if (pEdit == obj)
{
switch (pEvent->key())
{
case Qt::Key_Left:
if (pEdit->cursorPosition() == 0)
{
// user wants to move to previous item
MovePrevLineEdit(i);
}
break;
case Qt::Key_Right:
if (pEdit->text().isEmpty() || (pEdit->text().size() == pEdit->cursorPosition()))
{
// user wants to move to next item
MoveNextLineEdit(i);
}
break;
case Qt::Key_0:
if (pEdit->text().isEmpty() || pEdit->text() == "0")
{
pEdit->setText("0");
// user wants to move to next item
MoveNextLineEdit(i);
}
emit signalTextChanged(pEdit);
break;
case Qt::Key_Backspace:
{
QString sSelectText = pEdit->selectedText();
if (!sSelectText.isEmpty())
{
emit signalTextChanged(pEdit);
}
else if (pEdit->text().isEmpty() || pEdit->cursorPosition() == 0)
{
// user wants to move to previous item
MovePrevLineEdit(i);
}
}
break;
case Qt::Key_Comma:
case Qt::Key_Period:
MoveNextLineEdit(i);
break;
default:
emit signalTextChanged(pEdit);
break;
}
}
}
}
}
return bRes;
}
void MacCtrl::MoveNextLineEdit(int i)
{
if (i + 1 != QTUTL_IP_SIZE)
{
m_pLineEdit[i + 1]->setFocus();
m_pLineEdit[i + 1]->setCursorPosition(0);
m_pLineEdit[i + 1]->selectAll();
}
}
void MacCtrl::MovePrevLineEdit(int i)
{
if (i != 0)
{
m_pLineEdit[i - 1]->setFocus();
m_pLineEdit[i - 1]->setCursorPosition(m_pLineEdit[i - 1]->text().size());
//m_pLineEdit[i-1]->selectAll();
}
}
QString MacCtrl::getMacValue()
{
QString ipvalue;
for (int i = 0; i < QTUTL_IP_SIZE - 1; i++)
{
ipvalue = ipvalue + m_pLineEdit[i]->text() + ":";
}
ipvalue = ipvalue + m_pLineEdit[5]->text();
return ipvalue;
}
void MacCtrl::setMacValue(QString ipValue)
{
QString tmpIpValue = ipValue;
if (ipValue.isEmpty())
{
tmpIpValue = "00:00:00:00:00:00";
}
QStringList ippodList = tmpIpValue.split(":");
if (ippodList.size() == 6)
{
for (int i = 0; i < QTUTL_IP_SIZE; i++)
{
m_pLineEdit[i]->setText(ippodList.at(i));
}
}
else
{
QString sTmpStr;
for (int i = 0; i < QTUTL_IP_SIZE; i++)
{
sTmpStr = tmpIpValue.left(2);
tmpIpValue = tmpIpValue.right(tmpIpValue.length() - 2);
m_pLineEdit[i]->setText(sTmpStr);
}
}
}