QValidator修正问题



以下是我的代码,用于验证帐户代码,并每隔一定时间添加短划线。帐户代码示例为140-100-1000-6610-543。该代码采用正则表达式:d{3}-d{3}-d{4}-d{4}-d{3],并允许用户键入数字,在正则表达式中有破折号的地方,它会为用户放置破折号。或者更确切地说,它应该这样做。在我们的生产服务器(('Qt版本:','4.8.1'),('SIP版本:'、'4.13.2'),('PyQt版本:'、'4.9.1'))上,它确实可以工作。我们的开发服务器已升级到('Qt版本:','4.8.6')、('SIP版本:'、'4.15.5')和('PyQt版本:'、'4.10.4'),但在那里无法工作。

在每台服务器上,我输入140。在生产(旧版本)上,行编辑值更改为140-。在较新版本的开发服务器上,它不添加破折号。

如果你看到我的问题,请告诉我,如果这是PyQt问题,或者Qt问题。

import sys
from PyQt4 import QtGui, QtCore
DEBUG = True
class acValidator(QtGui.QRegExpValidator):
    def __init__(self, regexp, widget):
        QtGui.QRegExpValidator.__init__(self, regexp, widget)
        self.widget = widget
    def validate(self, text, pos):
        '''function to decide if this account code is valid'''
        valid, _npos = QtGui.QRegExpValidator.validate(self, text, pos)
        if valid != QtGui.QValidator.Acceptable:
            self.fixup(text)
            print 'acWidget.validate result of fixup', text
            # move position to the end, if fixup just added a dash
            # to the end
            newstr = self.widget.text()
            newpos = len(str(newstr))
            if pos + 1 == newpos and newstr[pos:newpos] == '-':
                pos = newpos
        # return the valid variable, and the current position
        return (valid, pos)
    def fixup(self, text):
        '''place dashes, if we can'''
        # pylint: disable=no-member
        if DEBUG:
            print 'acWidget.py fixup'
        reParts = self.regExp().pattern().split('-')
        if DEBUG:
            print list(reParts)
        newreg = ''
        for i in range(len(reParts)):
            newreg += reParts[i]
            if DEBUG:
                print i, reParts[i]
            nr = QtCore.QRegExp(newreg)
            # pylint: disable=no-member
            if nr.exactMatch(text) and not self.regExp().exactMatch(text):
                if DEBUG:
                    print 'adding dash'
                text += '-'
                return
            newreg += '-'
    def isValid(self):
        '''return a true or false for the validity based on whether the
        widget is a lineEdit or a comboBox (acCB).  true only if the
        validator returns QtGui.QValidator.Acceptable
        '''
        valid, _npos = QtGui.QRegExpValidator.validate(self,
                        self.widget.text(),
                        self.widget.cursorPosition())
        if valid == QtGui.QValidator.Acceptable:
            return True
        return False

class acWidget(QtGui.QLineEdit):
    def __init__(self, parent=None):
        QtGui.QLineEdit.__init__(self, parent)
        self.regex = r'd{3}-d{3}-d{4}-d{4}-d{3}'
        self.setMinimumWidth(200)
        self.setValidator(acValidator(QtCore.QRegExp(self.regex),
                    self))
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    form = QtGui.QDialog()
    layout = QtGui.QVBoxLayout(form)
    a = acWidget(form)
    layout.addWidget(a)
    form.setLayout(layout)
    form.setMinimumWidth(400)
    form.setMinimumHeight(200)
    form.show()
    app.exec_()

问题是由fixupvalidate的C++签名引起的,要求text参数是可修改的。如果您使用的是Python 2,PyQt会尊重这种明显不符合Python的做事方式;而对于Python3,签名已经更改,因此方法只返回修改后的值。

代码中的具体问题可以在这里找到:

    def fixup(self, text):
        ...
        text += '-'

似乎,在早期版本的PyQt中,QString上的增广分配进行了隐式原位突变。但在最近的版本中,它的工作方式更像普通的python增强赋值,只是像这样重新绑定本地变量:

        text = text + '-'

为了解决这个问题,你可以做一个显式的原位突变:

        text.append('-')

相关内容

  • 没有找到相关文章

最新更新