Skip to content Skip to sidebar Skip to footer

User Input Validation In Pyqt5 And Python

This is a two part question about input validation with one specific and another more general component. The specific: While researching the topic, I found THIS on Regular Expressi

Solution 1:

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

classMyWidget(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()

Solution 2:

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

classMyWidget(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()

Post a Comment for "User Input Validation In Pyqt5 And Python"