User Input Validation in PyQt5 and Python

后端 未结 2 1934
心在旅途
心在旅途 2021-01-18 20:09

This is a two part question about input validation with one specific and another more general component.

The specific:

While researching the

相关标签:
2条回答
  • 2021-01-18 20:36

    You can set different validators for different QLineEdit objects.

    QRegExpValidator has two constructors:

    QRegExpValidator(parent: QObject = None)
    QRegExpValidator(QRegExp, parent: QObject = None)
    

    so, you should change your code to:

    reg_ex = QRegExp("[0-9]+.?[0-9]{,2}")
    input_validator = QRegExpValidator(reg_ex, self.le_input)
    self.le_input.setValidator(input_validator)
    

    Once you set validator for QLineEdit, there is no need to use

    self.le_input.textChanged.connect(self.validate_input)
    

    Just delete it. And that should work fine.

    If you want to find documentation about PyQt5, you can simple use this in your console:

    pydoc3 PyQt5.QtGui.QRegExpValidator
    

    But pydoc can only show you little information, so you should use C++ version documation as well.

    Finally, an example about this:

    from PyQt5.Qt import QApplication
    from PyQt5.QtCore import QRegExp
    from PyQt5.QtGui import QRegExpValidator
    from PyQt5.QtWidgets import QWidget, QLineEdit
    
    import sys
    
    class MyWidget(QWidget):
        def __init__(self, parent=None):
            super(QWidget, self).__init__(parent)
            self.le_input = QLineEdit(self)
    
            reg_ex = QRegExp("[0-9]+.?[0-9]{,2}")
            input_validator = QRegExpValidator(reg_ex, self.le_input)
            self.le_input.setValidator(input_validator)
    
    if __name__ == '__main__':
        a = QApplication(sys.argv)
    
        w = MyWidget()
        w.show()
    
        a.exec()
    
    0 讨论(0)
  • 2021-01-18 20:46

    Either methods seems to work well with input validation except for textChanged() signal when two lineEdits which affects each other when using the same slot function .However I have a comment on QRegExpValidator, it may scare the user to think their keyboard is not working since trying to type anything not allowed shows nothing(no interaction whatsoever) while using textChanged() signal can allow some interaction using some statements in the slot function. Any thoughts on my view above? How can I address this? @eyllanesc

    I have made my conclusion by trying this code example shared above and many other examples I may not be able to share:

    from PyQt5.Qt import QApplication
    from PyQt5.QtCore import QRegExp
    from PyQt5.QtGui import QRegExpValidator
    from PyQt5.QtWidgets import QWidget, QLineEdit
    
    import sys
    
    class MyWidget(QWidget):
        def __init__(self, parent=None):
            super(QWidget, self).__init__(parent)
            self.le_input = QLineEdit(self)
    
            reg_ex = QRegExp("[0-9]+.?[0-9]{,2}")
            input_validator = QRegExpValidator(reg_ex, self.le_input)
            self.le_input.setValidator(input_validator)
    
    if __name__ == '__main__':
        a = QApplication(sys.argv)
    
        w = MyWidget()
        w.show()
    
        a.exec()
    
    0 讨论(0)
提交回复
热议问题