PyQt4实现封装的QT的ip地址控件
<DIV><DIV class=article_content>
<P>由于QT没有提供现成的IP地址控件,而仅仅使用正则表达式和inputMask为QLineEdit进行IP地址输入限制和验证,效果不怎么理想。所以用PyQt4封装了一个IPv4地址控件。</P>
<P>from PyQt4.QtGui import *<BR>from PyQt4.QtCore import *</P>
<P><BR>class IpPartEdit(QLineEdit):<BR> def __init__(self, parent = None):<BR> QLineEdit.__init__(self, parent)</P>
<P><BR> self.nextTab = None<BR> self.setMaxLength(3)<BR> self.setFrame(False)<BR> self.setAlignment(Qt.AlignCenter)<BR><BR> validator = QIntValidator(0, 255, self)<BR> self.setValidator(validator)<BR><BR> self.connect(self, SIGNAL('textEdited(QString)'),\<BR> self, SLOT('text_edited(QString)'))<BR><BR> def set_nextTabEdit(self, nextTab):<BR> self.nextTab = nextTab<BR><BR> def focusInEvent(self, event):<BR> self.selectAll()<BR> super(IpPartEdit, self).focusInEvent(event)<BR><BR> def keyPressEvent(self, event):<BR> if (event.key() == Qt.Key_Period):<BR> if self.nextTab:<BR> self.nextTab.setFocus()<BR> self.nextTab.selectAll()<BR> super(IpPartEdit, self).keyPressEvent(event)<BR><BR> @pyqtSlot('QString')<BR> def text_edited(self, text):<BR> validator = QIntValidator(0, 255, self)<BR> ipaddr = text<BR> pos = 0<BR> <BR> state = validator.validate(ipaddr, pos)<BR> if state == QValidator.Acceptable:<BR> if ipaddr.size() > 1:<BR> if ipaddr.size() == 2:<BR> ipnum = ipaddr.toInt()<BR> if ipnum > 25:<BR> if self.nextTab:<BR> self.nextTab.setFocus()<BR> self.nextTab.selectAll()<BR> else:<BR> if self.nextTab:<BR> self.nextTab.setFocus()<BR> self.nextTab.selectAll()<BR><BR>class Ip4Edit(QLineEdit):<BR> def __init__(self, parent = None):<BR> QLineEdit.__init__(self, parent)<BR><BR> self.ip_part1 = IpPartEdit()<BR> self.ip_part2 = IpPartEdit()<BR> self.ip_part3 = IpPartEdit()<BR> self.ip_part4 = IpPartEdit()<BR> self.ip_part1.setAlignment(Qt.AlignCenter)<BR> self.ip_part2.setAlignment(Qt.AlignCenter)<BR> self.ip_part3.setAlignment(Qt.AlignCenter)<BR> self.ip_part4.setAlignment(Qt.AlignCenter)<BR><BR> self.labeldot1 = QLabel('.')<BR> self.labeldot2 = QLabel('.')<BR> self.labeldot3 = QLabel('.')<BR> self.labeldot1.setAlignment(Qt.AlignCenter)<BR> self.labeldot2.setAlignment(Qt.AlignCenter)<BR> self.labeldot3.setAlignment(Qt.AlignCenter)<BR><BR> layout = QHBoxLayout() <BR> layout.addWidget(self.ip_part1)<BR> layout.addWidget(self.labeldot1)<BR> layout.addWidget(self.ip_part2)<BR> layout.addWidget(self.labeldot2)<BR> layout.addWidget(self.ip_part3)<BR> layout.addWidget(self.labeldot3)<BR> layout.addWidget(self.ip_part4)<BR> layout.setSpacing(0)<BR> layout.setContentsMargins(QMargins(2, 2, 2, 2))<BR> <BR> self.setLayout(layout)<BR><BR> QWidget.setTabOrder(self.ip_part1, self.ip_part2)<BR> QWidget.setTabOrder(self.ip_part2, self.ip_part3)<BR> QWidget.setTabOrder(self.ip_part3, self.ip_part4)<BR> self.ip_part1.set_nextTabEdit(self.ip_part2)<BR> self.ip_part2.set_nextTabEdit(self.ip_part3)<BR> self.ip_part3.set_nextTabEdit(self.ip_part4)<BR><BR> self.connect(self.ip_part1, SIGNAL('textChanged(QString)'),\<BR> self, SLOT('textChangedSlot(QString)'))<BR> self.connect(self.ip_part2, SIGNAL('textChanged(QString)'),\<BR> self, SLOT('textChangedSlot(QString)'))<BR> self.connect(self.ip_part3, SIGNAL('textChanged(QString)'),\<BR> self, SLOT('textChangedSlot(QString)'))<BR> self.connect(self.ip_part4, SIGNAL('textChanged(QString)'),\<BR> self, SLOT('textChangedSlot(QString)'))<BR><BR> self.connect(self.ip_part1, SIGNAL('textEdited(QString)'),\<BR> self, SLOT('textEditedSlot(QString)'))<BR> self.connect(self.ip_part2, SIGNAL('textEdited(QString)'),\<BR> self, SLOT('textEditedSlot(QString)'))<BR> self.connect(self.ip_part3, SIGNAL('textEdited(QString)'),\<BR> self, SLOT('textEditedSlot(QString)'))<BR> self.connect(self.ip_part4, SIGNAL('textEdited(QString)'),\<BR> self, SLOT('textEditedSlot(QString)'))<BR><BR> @pyqtSlot('QString')<BR> def textChangedSlot(self, text):<BR> ippart1 = self.ip_part1.text()<BR> ippart2 = self.ip_part2.text()<BR> ippart3 = self.ip_part3.text()<BR> ippart4 = self.ip_part4.text()<BR><BR> ipaddr = QString('%1.%2.%3.%4')\<BR> .arg(ippart1)\<BR> .arg(ippart2)\<BR> .arg(ippart3)\<BR> .arg(ippart4)<BR> self.emit(SIGNAL('textChanged'), ipaddr)<BR><BR> @pyqtSlot('QString')<BR> def textEditedSlot(self, text):<BR> ippart1 = self.ip_part1.text()<BR> ippart2 = self.ip_part2.text()<BR> ippart3 = self.ip_part3.text()<BR> ippart4 = self.ip_part4.text()<BR><BR> ipaddr = QString('%1.%2.%3.%4')\<BR> .arg(ippart1)\<BR> .arg(ippart2)\<BR> .arg(ippart3)\<BR> .arg(ippart4)<BR> self.emit(SIGNAL('textEdited'), ipaddr)<BR><BR> def setText(self, text):<BR> regexp = QRegExp('^((2\d|25|?\d\d?).){3}(2\d||25|?\d\d?)$')<BR> validator = QRegExpValidator(regexp ,self)<BR> nPos = 0<BR> state = validator.validate(text, nPos)<BR><BR> ippart1 = QString()<BR> ippart2 = QString()<BR> ippart3 = QString()<BR> ippart4 = QString()<BR><BR> if state == QValidator.Acceptable: # valid<BR> ippartlist = text.split('.')<BR><BR> strcount = len(ippartlist)<BR> index = 0<BR> if index < strcount:<BR> ippart1 = ippartlist<BR> index += 1<BR> if index < strcount:<BR> ippart2 = ippartlist<BR> index += 1<BR> if index < strcount:<BR> ippart3 = ippartlist<BR> index += 1<BR> if index < strcount:<BR> ippart4 = ippartlist<BR><BR> self.ip_part1.setText(ippart1)<BR> self.ip_part2.setText(ippart2)<BR> self.ip_part3.setText(ippart3)<BR> self.ip_part4.setText(ippart4)<BR><BR> def text(self):<BR> ippart1 = self.ip_part1.text()<BR> ippart2 = self.ip_part2.text()<BR> ippart3 = self.ip_part3.text()<BR> ippart4 = self.ip_part4.text()<BR><BR> return QString('%1.%2.%3.%4')\<BR> .arg(ippart1)\<BR> .arg(ippart2)\<BR> .arg(ippart3)\<BR> .arg(ippart4)<BR><BR> def setStyleSheet(self, styleSheet):<BR> self.ip_part1.setStyleSheet(styleSheet)<BR> self.ip_part2.setStyleSheet(styleSheet)<BR> self.ip_part3.setStyleSheet(styleSheet)<BR> self.ip_part4.setStyleSheet(styleSheet)<BR></P></DIV></DIV>
页:
[1]