QT mac控件封装

#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);
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值