PyQt:QValidator 函数定义

5 投票
1 回答
8575 浏览
提问于 2025-04-18 02:55

我现在用了一种比较粗暴的方法来实现QValidator本来可以轻松做到的事情。想要找到这个小部件的简单信息真是太难了。下面的代码是我从另一篇帖子里复制粘贴过来的(经过一些小修改)。它创建了一个对话框,里面有一个单行输入框,这个输入框连接了一个叫ValidStringLength的QValidator,这个验证器要求字符串的长度必须在0到5之间。我想了解一下,应该把一个清理字符串的“可执行”函数放在哪里:是在fixup()方法里面吗?请解释一下QValidator()的逻辑。


   from PyQt4 import QtCore, QtGui
    class ValidStringLength(QtGui.QValidator):
        def __init__(self, min, max, parent):
            QtGui.QValidator.__init__(self, parent)

            self.min = min
            self.max = max

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

            if self.max > -1 and len(s) > self.max:
                return (QtGui.QValidator.Invalid, pos)

            if self.min > -1 and len(s) < self.min:
                return (QtGui.QValidator.Intermediate, pos)

            return (QtGui.QValidator.Acceptable, pos)

        def fixup(self, s):
            pass


    class Window(QtGui.QWidget):
        def __init__(self):
            QtGui.QWidget.__init__(self)

            self.editLine = QtGui.QLineEdit(self)
            self.validator = ValidStringLength(0,5,self)

            self.editLine.setValidator(self.validator)

            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.editLine)

    if __name__ == '__main__':

        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.setGeometry(500, 300, 500, 100)
        window.show()
        sys.exit(app.exec_())

1 个回答

1

来自Qt文档的内容:

fixup()是为那些可以修复用户错误的验证器提供的。默认情况下,它什么都不做。比如,QLineEdit会在用户按下回车键(Enter或Return)且内容不合法时调用fixup()。这给了fixup()一个机会,可以做一些“魔法”,把不合法的字符串变成合法的。

http://qt-project.org/doc/qt-4.8/qvalidator.html

所以,如果你的“字符串清理”是为了纠正用户的输入,那么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())

撰写回答