2013-07-29 2 views
0

код отлично работает в API v1, если я раскомментировать верхние вызовы SIP, то это означает, что я буду использовать v2, то, конечно, я буду видеть ошибки какКак переопределить qvalidator.validate() в api v2?

TypeError: invalid result type from Validator.validate()

я знаю, что нужно для изменения возвращаемого значения .validate(), но если я изменю его на то, что говорит pyqt doc в v2, http://pyqt.sourceforge.net/Docs/PyQt4/qvalidator.html#validate-2 , он дает мне ошибку сегментации (на pyqt 4.6.1, centos 6.3 x64). Зачем?

Код v2 отлично работает на pyqt 4.8 и 4.10, хотя (протестирован на fedora 19 linux и машине с Windows 7). Это ошибка или что мне не хватает?

спасибо!

#!/usr/bin/env python2 

# api v2 
import sip 
sip.setapi('QString', 2) 
sip.setapi('QVariant', 2) 

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
import re,os,sys 

class MyQComboBox(QComboBox): 
    def __init__(self, parent=None, listing=None): 
     super(MyQComboBox, self).__init__(parent) 

     if listing != None: 
      self.listSetup(listing) 

    def listSetup(self, listing): 
     self.setEditable(True) 

     self.listing = listing 
     self.clear() 
     self.addItems(self.listing) 

     self.completer = QCompleter(self.listing) 
     self.setCompleter(self.completer) 

     self.valid = QValidator_listValid(self, listing = self.listing) 
     self.setValidator(self.valid) 


# api v1 
# class QValidator_listValid(QValidator): 
#  def __init__(self, parent=None, listing=None): 
#   super(QValidator_listValid, self).__init__(parent) 
#   self.listing = listing 

#  def validate(self, input, pos=None): 
#   for name in self.listing: 
#    if re.match(str(input), name, re.I): 
#     return (QValidator.Acceptable, pos) 
#   return (QValidator.Invalid, pos) 

# api v2 
class QValidator_listValid(QValidator): 
    def __init__(self, parent=None, listing=None): 
     super(QValidator_listValid, self).__init__(parent) 
     self.listing = listing 

    def validate(self, input, pos=None): 
     for name in self.listing: 
      if re.match(input, name, re.I): 
       return (QValidator.Acceptable,input, pos) 
     return (QValidator.Invalid,input,pos) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 

    ui = MyQComboBox() 
    ui.listSetup(['aaa','bbb','ccc']) 
    ui.show() 
    sys.exit(app.exec_()) 

ответ

0

Я не эксперт, но, возможно, это поможет:

class MetaNameLineEdit(QtGui.QLineEdit): 
    Prefix = 'New_' 
    Pattern = '^{prefix}([A-Za-z0-9_]{{0,{n}}})$'.format(prefix=Prefix, n=50) 

    def __init__(self, parent): 
     QtGui.QLineEdit.__init__(self, parent) 
     self.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp(self.Pattern), self))