Python PyQt:QValidator函数定义

Python PyQt:QValidator函数定义,python,pyqt,Python,Pyqt,我目前正在使用一种非常残酷的方法来获取QValidator可以轻松交付的内容。在这个小部件上定位一个简单的信息是相当困难的。下面的代码是从另一篇文章复制/粘贴的(经过一些小的编辑)。它创建了一个对话框,其中单线编辑连接到ValidStringLength QValidator,它强制字符串大小为0self.max: 返回(QtGui.QValidator.Invalid,pos) 如果self.min>-1且len(s)

我目前正在使用一种非常残酷的方法来获取QValidator可以轻松交付的内容。在这个小部件上定位一个简单的信息是相当困难的。下面的代码是从另一篇文章复制/粘贴的(经过一些小的编辑)。它创建了一个对话框,其中单线编辑连接到ValidStringLength QValidator,它强制字符串大小为0<长度<5。我想知道字符串清理“可执行”函数应该放在哪里:在fixup()方法中?请解释QValidator()背后的逻辑


从PyQt4导入QtCore,QtGui
类ValidStringLength(QtGui.QValidator):
定义初始值(自身、最小值、最大值、父项):
QtGui.QValidator.\uuuu init\uuuu(self,parent)
self.min=min
self.max=max
def验证(自身、s、pos):
打印“验证():”,类型,类型(pos),类型,pos
如果self.max>-1且len(s)>self.max:
返回(QtGui.QValidator.Invalid,pos)
如果self.min>-1且len(s)
来自Qt文档:

fixup()是为可以修复某些用户错误的验证器提供的。默认实现不执行任何操作。例如,如果用户按Enter(或Return)并且内容当前无效,QLineEdit将调用fixup()。这使fixup()函数有机会执行一些魔术,使无效字符串可以接受

因此,是的,如果您的“字符串清理”是为了纠正用户的输入,
fixup
应该是正确的地方

编辑:

这应大写前四个字符:

def validate(self, s, pos):
    print 'validate(): ', type(s), type(pos), s, pos

    n = min(4,s.count())
    if s.left(n).compare(s.left(n).toUpper()):
        return (QtGui.QValidator.Intermediate, pos)
    else:
        return (QtGui.QValidator.Acceptable, pos)

def fixup(self, s):
    n = min(4, s.count())
    s.replace(0, n, s.left(n).toUpper())

应该从何处调用fixup()方法?以及如何返回更新(清理)的字符串并使用它更新lineEdit?请举一些例子。。假设我们要大写前四个字符…如果您使用lineEdit,您不必自己调用它。如果验证器状态不可接受,lineEdit将调用
fixup
,您可以就地修改字符串(qString是可变的,与python字符串不同)。如果修改的字符串有效,lineEdit将更改显示的文本。我添加了一个经过测试的示例。FWIW:您可能希望研究如何将api 2用于QString,它将自动将所有QString转换为python字符串。因此,您不必使用非常不带Pythic C++的字符串操作函数。在这种情况下,
fixup
validate
必须返回修改后的字符串。塞巴斯蒂安干得好!谢谢你的信息!
def validate(self, s, pos):
    print 'validate(): ', type(s), type(pos), s, pos

    n = min(4,s.count())
    if s.left(n).compare(s.left(n).toUpper()):
        return (QtGui.QValidator.Intermediate, pos)
    else:
        return (QtGui.QValidator.Acceptable, pos)

def fixup(self, s):
    n = min(4, s.count())
    s.replace(0, n, s.left(n).toUpper())