2015-12-02 2 views
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')), он работает , Наш Dev-сервер обновлен до версии ('Qt version:', '4.8.6'), ('SIP version:', '4.15.5'), ('PyQt version:', '4.10.4'), и это doesn Там нет работы.QValidator fixup issue

На каждом сервере я печатаю 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_() 

ответ

1

Проблема вызвана подписями C++ в fixup и validate, требующих, чтобы text аргумент является изменяемым. Если вы используете Python 2, этот явно бесстрашный способ делать что-то заслуживает PyQt; тогда как с Python 3, signatures have been changed, чтобы методы просто возвращали измененные значения.

Конкретная проблема в коде можно найти здесь:

def fixup(self, text): 
     ... 

     text += '-' 

кажется, что в более ранних версиях PyQt, дополненных задание на QString сделали неявную мутацию в месте. Но в более поздних версиях, он работает больше как обычный питона дополненной задания и просто повторно связывает локальную переменную так:

 text = text + '-' 

Чтобы обойти это, вы можете сделать explict в месте мутации:

 text.append('-') 
+0

Большое вам спасибо, ekhumoro! Ты прав. Мы все еще используем 2.7 на новом сервере, но что-то явно изменилось. Еще раз спасибо! – Kerri