1

以下是我验证帐户代码并以特定间隔添加破折号的代码。一个示例帐户代码是140-100-1000-6610-543。该代码采用正则表达式:\d{3}-\d{3}-\d{4}-\d{4}-\d{3]并允许用户输入数字,并且在正则表达式中有破折号的地方,它为用户放置破折号。或者更确切地说,它应该。在我们的生产服务器上 (('Qt version:', '4.8.1'), ('SIP version:', '4.13.2'), ('PyQt version:', '4.9.1')) 它确实有效. 我们的开发服务器升级到 ('Qt version:', '4.8.6'), ('SIP version:', '4.15.5'), ('PyQt version:', '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_()
4

1 回答 1

1

该问题是由 的 C++ 签名引起的,fixup并且validate要求该text参数是可修改的。如果您使用的是 Python 2,那么 PyQt 会尊重这种明显不符合 Python 的做事方式;而在 Python 3 中,签名已更改,因此方法只需返回修改后的值。

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

    def fixup(self, text):
        ...

        text += '-'

似乎,在 PyQt 的早期版本中,对 a 的增强赋值QString做了一个隐式的就地突变。但在最近的版本中,它更像是普通的 python 增强赋值,只是像这样重新绑定局部变量:

        text = text + '-'

要解决此问题,您可以执行显式就地突变:

        text.append('-')
于 2015-12-03T02:32:36.573 回答